Трамплин на переход в "long mode" (64 бит) действительно находится в /boot/loader, я нашел как это выглядит.
/boot/loader является 32-х битным приложением, у него есть конфигурационный массив struct file_format *file_formats[] который заполнется указателями на функции загрузки и исполнения ELF модуля (или ядра) для различных архитектур:
Согласно статье в Handbook-е, boot2 состоит из следующих частей: boot2 релокатора, BTX-клиента и BTX-сервера. Переход в защищенный режим прозводиться в BTX сервере - он работает в 0-м кольце. Сервер нужен для возврата в 16-ти битный режим и вызова функций BIOS. BTX-клиент работает в 3-м кольце, он загружает загрузчик четвертой стадии /boot/loader. А этот уже загружает и запускает ядро. Это только часть схемы для MBR. Для других вариантов загрузки все подругому. Я нагуглил статью про процессы загрузки FreeBSD, пытаюсь из неё что-то понять.
Для загрузки с GPT используется отдельный загрузчик gptboot, он имеется в двух вариантах для UEFI и для BIOS.
Функция elf64_exec() это трамплин, её вызов присутствует в нескольких загрузчиках, в том числе в UEFI, gptboot, userboot, но её вызова нет из boot1-boot2 (MBR загрузчик). Код boot1, boot2 и BTX весь 32-х битный. Этот загрузчик хорошо задокументирован - есть большая с статья с описанием в Handbook-е. Про устройство остальных загрузчиков информации мало, надо изучать код.
В статье я описывал, что занимался сборкой ядер, драйверов и системных приложений для FreeBSD, у меня установлены ВСЕ необходимые для этого тулы. rustc среди них пока что не замечен, кода на Rust в ядре нет! (три раза сплюнул)
Я кое-что протестировал и вот что обнаружил. Старая машинка у меня всё же оказалась с UEFI, c 32-х битным, в ней AMD E-350 где-то 2011 года. Так вот, при попытке установить 64-х битную FreeBSD 15.0-RELEASE в раздел MBR, фрюшный Инсталлер добросовестно предупреждает, что загружаться система НЕ будет:
Фото 1
И действительно, после завершения установки и перезагрузки, от BIOS вывалило следующее сообщение:
Фото 2
То есть возвращаясь к изначальному вопросу пользователя @unreal_undead2 , ответ следующий: 64-х битная FreeBSD на 32-х битном и на 64-х битном UEFI в режиме BIOS (CSM) не загружается!
А вот с GPT таблицей разделов - очень даже загружается! Но как я отмечал в статье, старые макбуки не распознают диск с таблицей GPT как загрузочный! Поэтому, выходов у меня было два: либо ставить 32-х битную FreeBSD, либо патчить загрузчик loader_ia32.efi чтобы установить 64-х битную. Я проделал оба варианта.
Как ведет себя 64-х битная FreeBSD на машинах без UEFI я пока проверить не могу. Но я потратил некоторое время на чтение исходных кодов загрузчиков, которые используются при старте из MBR, и я пока НЕ вижу там кода "трамплина" для перехода в "long mode" (64-х битный режим). Там есть код перехода в 32-х битный "Protected Mode" - но это позволяет стартовать только 32-х битные ядра. Определенно есть какой-то нюанс, я попытаюсь в нем разобраться.
Очень интересная статья. Хорошо и подробно всё описано. Наверное, одна из лучших технических статьей года будет на Хабре как на мой взгляд)
Спасибо, что нашли время прочитать.
Странно, что у вашего MacBook-a до сих пор DVD-привод читает диски. У моего iMac давно перестал читать. У них вроде как со временем лазер слабеет.
Ну как сказать, работает, через раз. Требуется несколько раз выключить и включить питание и тогда он заводится. Но если завёлся, то читае без ошибок. Похоже, что какие-то кондёры высохли в системе питания привода.
Почему каждый раз нужно запускать fsck я вот не понял? UFS не умеет в журналирование?
В файловой системе UFS есть такая фича как Soft Update - это альтернатива журналированию, имплементированная Кирком МакКузиком еще в 1999 году. Soft Updates работает существенно быстрее чем журналирование, но со своими особенностями - не все сбои разрешимы. С версии 9.0-RELEASE появилось настоящее журналирование (по умолчанию отключено), но оно существенно увеличивает количество записей на диск и на SSD его лучше не применять. fsck -f -y подчищает всякий мусор и гарантирует, что в момент монтирования на read-write файловая система будет полностью consistent. Если эту команду не делать при загрузке, то файловая система всё равно будет рабочей, но с некторыми inconsistencies, они могут накапливаться и если сбои по питанию пойдут один за другим, то файловая система сломается и тогда уже придется применять более серьезные средства.
И странно, что переключение раскладок вы настроили в XFce. Традиционно это в xorg конфигах делают.
Я раньше так и делал. Но сейчас есть мода на использование Xorg в "бесконфижном" варианте, поэтому настойки клавиатуры перенес в конфиг xfce. А еще этой позволяет каждому пользователю натсроить совой способ переключения раскладки: у меня супруга привыкла к виндовому варианту LeftCtrl+LeftShift, а я вот люблю самую бесполезную клавишу CapsLock для этих целей. :-)
То, что вы поучаствовали в разработке FreeBSD — это круто, у меня вызывает серьёзное уважение!)
Ну как поучаствовал - постоял рядом, ключи подавал. :-) Но меня порадовало то, что разработчики очень быстро отреагировали на баг-репорт и принялись чинить. Это второй мой баг-репорт во FreeBSD. :)
У меня есть старенький комп с Атлоном и без UEFI, я попробую на него поставить 64-х битную фрю на MBR. На MacBook-е это не заработало, я пробовал ставить 15.-RELEASE/amd64 и в GPT, и в MBR.
Я препочитаю иметь возможность читать исходники и править баги (или хотя бы делать баг-репорты, так чтобы их оперативно исправляли). Если часть системы будет написана на Rust, то мне это уже будет не доступно и я от такой системы избавлюсь.
Да, загрузка с ZFS возможна через BIOS, но не на макбуке 2008-го года с 2ГБ ОЗУ. Даже если попытаться это сделать, я совсем не уверен в том, что там не выползут проблемы аналогичные тем, которые всплыли в loader_ia32.efi.
В этой инструкции используют специальный загрузчик zfsboot, он умеет. Классический - не умеет. Но ZFS на такой древнючей машине лучше даже не пытаться.
Да, есть помежуточные загрузчики (Boot Manager-ы), об одном из них (rEFInd) я написал.
Есть такая старая поговорка: "в чужой монастырь со своим уставом...". Ну или как преехать в другую страну и удивляться, почем вас не понимают когда вы говорите по-русски. Вот это всё про них.
Трамплин на переход в "long mode" (64 бит) действительно находится в /boot/loader, я нашел как это выглядит.
/boot/loader является 32-х битным приложением, у него есть конфигурационный массив struct file_format *file_formats[] который заполнется указателями на функции загрузки и исполнения ELF модуля (или ядра) для различных архитектур:
В свою очередь amd64_elf это структура с двумя указателями на функции загрузки и исполнения:
А elf64_exec это указатель на функцию которая содержит вызов трамплина amd64_tramp().
Получается, что /boot/loader загруженный через MBR может запускать 64-х битные ядра.
Осталось выяснить, почему схема boot0->boot1-boot2->loader не срабатывает в режиме совместимости BIOS (CSM).
Согласно статье в Handbook-е, boot2 состоит из следующих частей: boot2 релокатора, BTX-клиента и BTX-сервера. Переход в защищенный режим прозводиться в BTX сервере - он работает в 0-м кольце. Сервер нужен для возврата в 16-ти битный режим и вызова функций BIOS. BTX-клиент работает в 3-м кольце, он загружает загрузчик четвертой стадии /boot/loader. А этот уже загружает и запускает ядро. Это только часть схемы для MBR. Для других вариантов загрузки все подругому. Я нагуглил статью про процессы загрузки FreeBSD, пытаюсь из неё что-то понять.
Вот, кстати, все схемы по стадиям:
Схемы загрузки FreeBSD
Нет. ZFS, кстати, надо будет попробовать.
Для загрузки с GPT используется отдельный загрузчик gptboot, он имеется в двух вариантах для UEFI и для BIOS.
Функция elf64_exec() это трамплин, её вызов присутствует в нескольких загрузчиках, в том числе в UEFI, gptboot, userboot, но её вызова нет из boot1-boot2 (MBR загрузчик). Код boot1, boot2 и BTX весь 32-х битный. Этот загрузчик хорошо задокументирован - есть большая с статья с описанием в Handbook-е. Про устройство остальных загрузчиков информации мало, надо изучать код.
Что такое userboot мне пока не понятно.
Спасибо, но причем тут FreeBSD ? 32-х битная FreeBSD загружается без танцев с подменой загрузчика - это на случай если Вы статью не читали.
Так Вы напишите пару интересных статей в песочницу, и желательно без нейрослопа. И будет Вам кармы хоть на рынке торгуй. :)
В статье я описывал, что занимался сборкой ядер, драйверов и системных приложений для FreeBSD, у меня установлены ВСЕ необходимые для этого тулы. rustc среди них пока что не замечен, кода на Rust в ядре нет! (три раза сплюнул)
Я кое-что протестировал и вот что обнаружил. Старая машинка у меня всё же оказалась с UEFI, c 32-х битным, в ней AMD E-350 где-то 2011 года. Так вот, при попытке установить 64-х битную FreeBSD 15.0-RELEASE в раздел MBR, фрюшный Инсталлер добросовестно предупреждает, что загружаться система НЕ будет:
Фото 1
И действительно, после завершения установки и перезагрузки, от BIOS вывалило следующее сообщение:
Фото 2
То есть возвращаясь к изначальному вопросу пользователя @unreal_undead2 , ответ следующий: 64-х битная FreeBSD на 32-х битном и на 64-х битном UEFI в режиме BIOS (CSM) не загружается!
А вот с GPT таблицей разделов - очень даже загружается! Но как я отмечал в статье, старые макбуки не распознают диск с таблицей GPT как загрузочный! Поэтому, выходов у меня было два: либо ставить 32-х битную FreeBSD, либо патчить загрузчик loader_ia32.efi чтобы установить 64-х битную. Я проделал оба варианта.
Как ведет себя 64-х битная FreeBSD на машинах без UEFI я пока проверить не могу. Но я потратил некоторое время на чтение исходных кодов загрузчиков, которые используются при старте из MBR, и я пока НЕ вижу там кода "трамплина" для перехода в "long mode" (64-х битный режим). Там есть код перехода в 32-х битный "Protected Mode" - но это позволяет стартовать только 32-х битные ядра. Определенно есть какой-то нюанс, я попытаюсь в нем разобраться.
Спасибо, что нашли время прочитать.
Ну как сказать, работает, через раз. Требуется несколько раз выключить и включить питание и тогда он заводится. Но если завёлся, то читае без ошибок. Похоже, что какие-то кондёры высохли в системе питания привода.
В файловой системе UFS есть такая фича как Soft Update - это альтернатива журналированию, имплементированная Кирком МакКузиком еще в 1999 году. Soft Updates работает существенно быстрее чем журналирование, но со своими особенностями - не все сбои разрешимы. С версии 9.0-RELEASE появилось настоящее журналирование (по умолчанию отключено), но оно существенно увеличивает количество записей на диск и на SSD его лучше не применять.
fsck -f -yподчищает всякий мусор и гарантирует, что в момент монтирования на read-write файловая система будет полностью consistent. Если эту команду не делать при загрузке, то файловая система всё равно будет рабочей, но с некторыми inconsistencies, они могут накапливаться и если сбои по питанию пойдут один за другим, то файловая система сломается и тогда уже придется применять более серьезные средства.Я раньше так и делал. Но сейчас есть мода на использование Xorg в "бесконфижном" варианте, поэтому настойки клавиатуры перенес в конфиг xfce. А еще этой позволяет каждому пользователю натсроить совой способ переключения раскладки: у меня супруга привыкла к виндовому варианту LeftCtrl+LeftShift, а я вот люблю самую бесполезную клавишу CapsLock для этих целей. :-)
Ну как поучаствовал - постоял рядом, ключи подавал. :-) Но меня порадовало то, что разработчики очень быстро отреагировали на баг-репорт и принялись чинить. Это второй мой баг-репорт во FreeBSD. :)
del
У меня есть старенький комп с Атлоном и без UEFI, я попробую на него поставить 64-х битную фрю на MBR. На MacBook-е это не заработало, я пробовал ставить 15.-RELEASE/amd64 и в GPT, и в MBR.
Я препочитаю иметь возможность читать исходники и править баги (или хотя бы делать баг-репорты, так чтобы их оперативно исправляли). Если часть системы будет написана на Rust, то мне это уже будет не доступно и я от такой системы избавлюсь.
На сколько я помню на PPC Маках нет BIOS, там своя кухня под названием "Open Firmware".
Я был слишком категоричен. :)
Короткий ответ: zfsboot.
Да, загрузка с ZFS возможна через BIOS, но не на макбуке 2008-го года с 2ГБ ОЗУ. Даже если попытаться это сделать, я совсем не уверен в том, что там не выползут проблемы аналогичные тем, которые всплыли в loader_ia32.efi.
Ну как разовьют, будем переползать на OpenBSD.
Покаместь этой инфекции не замечено.
Не даже, а специально! :-)
В этой инструкции используют специальный загрузчик zfsboot, он умеет. Классический - не умеет. Но ZFS на такой древнючей машине лучше даже не пытаться.
Да, есть помежуточные загрузчики (Boot Manager-ы), об одном из них (rEFInd) я написал.
Расскажите как ?
Да.
Есть такая старая поговорка: "в чужой монастырь со своим уставом...". Ну или как преехать в другую страну и удивляться, почем вас не понимают когда вы говорите по-русски. Вот это всё про них.