Обновить
210
Руслан@checkpoint

Old-time Unix hacker

0,5
Рейтинг
189
Подписчики
Отправить сообщение

Трамплин на переход в "long mode" (64 бит) действительно находится в /boot/loader, я нашел как это выглядит.

/boot/loader является 32-х битным приложением, у него есть конфигурационный массив struct file_format *file_formats[] который заполнется указателями на функции загрузки и исполнения ELF модуля (или ядра) для различных архитектур:

struct file_format *file_formats[] = {
        &multiboot,
        &multiboot_obj,
#ifdef LOADER_PREFER_AMD64
    &amd64_elf,
    &amd64_elf_obj,
#endif
    &i386_elf,
    &i386_elf_obj,
#ifndef LOADER_PREFER_AMD64
    &amd64_elf,
    &amd64_elf_obj,
#endif
    NULL
};

В свою очередь amd64_elf это структура с двумя указателями на функции загрузки и исполнения:

struct file_format amd64_elf = { elf64_loadfile, elf64_exec };

А 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
BIOS/ MBR/UFS

  +-> MBR from 'Boot Device' BIOS disk          | MBR
    +-> boot0                                   | STAGE 0
      +-> boot1                                 | STAGE 1
        +-> boot2                               | STAGE 2
          +-> loader                            | STAGE 3
            +-> kernel                          | KERNEL
              +-> init                          | INIT

BIOS/ MBR/ZFS
  +-> MBR from 'Boot Device' BIOS disk          | MBR
    +-> boot0                                   | STAGE 0
      +-> boot1                                 | STAGE 1
        +-> zfsboot         | STAGE 2
          +-> zfsloader    | STAGE 3
            +-> kernel                          | KERNEL
              +-> init                          | INIT

BIOS/ GPT/UFS
  +-> GPT from 'Boot Device' BIOS disk          | GPT
    +-> pmbr                                    | STAGE 0
      +-> gptboot                               | STAGE 1 + STAGE 2
        +-> loader                              | STAGE 3
          +-> kernel                            | KERNEL
            +-> init                            | INIT

BIOS/ GPT/ZFS
  +-> GPT from 'Boot Device' BIOS disk          | GPT
    +-> pmbr                                    | STAGE 0
      +-> gptzfsboot                            | STAGE 1 + STAGE 2
        +-> zfsloader (analogous to loader)     | STAGE 3
          +-> kernel                            | KERNEL
            +-> init                            | INIT

UEFI/GPT/MBR/UFS/ZFS
  +-> GPT/MBR from 'Boot Device' BIOS disk      | GPT/MBR
    +-> UEFI                                    | STAGE 0
      +-> boot1.efi (/efi/boot/boot${ARCH}.efi) | STAGE 1 + STAGE 2
        +-> loader.efi                          | STAGE 3
          +-> kernel                            | KERNEL
            +-> init                            | INIT

UEFI/GPT/MBR/UFS/ZFS (13.0 and later)
  +-> GPT/MBR from 'Boot Device' BIOS disk      | GPT/MBR
    +-> UEFI                                    | STAGE 0
      +-> loader.efi (/efi/FreeBSD/loader.efi)  | STAGE 1-3
        +-> kernel                              | KERNEL
          +-> init                              | INIT

У меня такое ощущение, что вы ZFS пытаетесь накатить в MBR

Нет. 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-х битные ядра. Определенно есть какой-то нюанс, я попытаюсь в нем разобраться.

Очень интересная статья. Хорошо и подробно всё описано. Наверное, одна из лучших технических статьей года будет на Хабре как на мой взгляд)

Спасибо, что нашли время прочитать.

Странно, что у вашего 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, то мне это уже будет не доступно и я от такой системы избавлюсь.

На сколько я помню на PPC Маках нет BIOS, там своя кухня под названием "Open Firmware".

Я был слишком категоричен. :)

Короткий ответ: zfsboot.

Да, загрузка с ZFS возможна через BIOS, но не на макбуке 2008-го года с 2ГБ ОЗУ. Даже если попытаться это сделать, я совсем не уверен в том, что там не выползут проблемы аналогичные тем, которые всплыли в loader_ia32.efi.

Так у freebsd тоже полно планов на развитие, в том числе и свой аналог systemd,

Ну как разовьют, будем переползать на OpenBSD.

да и rust они вроде добавили в базовую систему.

rz@horizon:~ % uname -a
FreeBSD horizon 14.3-RELEASE FreeBSD 14.3-RELEASE releng/14.3-n271432-8c9ce319fef7 GENERIC amd64

rz@horizon:~ % rustc
rustc: Command not found.

Покаместь этой инфекции не замечено.

Не даже, а специально! :-)

В этой инструкции используют специальный загрузчик zfsboot, он умеет. Классический - не умеет. Но ZFS на такой древнючей машине лучше даже не пытаться.

Да, есть помежуточные загрузчики (Boot Manager-ы), об одном из них (rEFInd) я написал.

Расскажите как ?

Есть такая старая поговорка: "в чужой монастырь со своим уставом...". Ну или как преехать в другую страну и удивляться, почем вас не понимают когда вы говорите по-русски. Вот это всё про них.

Информация

В рейтинге
2 417-й
Дата рождения
Зарегистрирован
Активность