Nighpher, я постараюсь ответить на ваш вопрос, но для более полного описания процесса загрузки, попробуйте статью IBM .
Хорошо, я предполагаю, что вы используете GRUB или GRUB2 в качестве загрузчика для объяснения. Прежде всего, когда BIOS обращается к вашему диску для загрузки загрузчика, он использует встроенные подпрограммы для доступа к диску, которые хранятся в знаменитом 13-часовом прерывании. Загрузчик (и ядро на этапе установки) используют эти подпрограммы при доступе к диску. Обратите внимание, что BIOS работает в режиме реального режима (16 бит) процессора, поэтому он не может адресовать более 2 ^ 20 байт оперативной памяти (2 ^ 20, а не 2 ^ 16), поскольку каждый адрес в реальном режиме состоит из сегмента_адреса * 16 + смещение где адрес сегмента и смещение 16-битные, см. http://en.wikipedia.org/wiki/X86_memory_segmentation ). Таким образом, эти подпрограммы не могут получить доступ к более чем 1 МБ ОЗУ, что является строгим ограничением и серьезным неудобством.
BIOS загружает код загрузчика прямо из MBR - первые 512 байт вашего диска и выполняет его. Если вы используете GRUB, этот код относится к этапу GRUB 1. Этот код загружает этап 1.5 GRUB, который находится либо в первых 32 КБ дискового пространства, называемых областью совместимости DOS, либо с фиксированного адреса файловой системы. Для этого не нужно понимать файловую систему, потому что даже этап 1.5 находится в файловой системе, это «сырой» код, который можно напрямую загрузить в ОЗУ и выполнить: http://www.pixelbeat.org/ документы / диск / . Загрузка stage1.5 с диска в RAM использует процедуры доступа к диску BIOS.
Stage1.5 содержит утилиты файловой системы, так что он может читать stage2 из файловой системы (ну, он по-прежнему использует BIOS 13h для чтения с диска в RAM, но теперь он может расшифровать информацию файловой системы об инодах и т. Д. И получить необработанный код из диск). Старые BIOS могут быть не в состоянии получить доступ ко всему HD из-за ограничений в режиме адресации диска - они могут использовать систему Cylinder-Head-Sector, не способную адресовать более чем первые 8 ГБ дискового пространства: http: //en.wikipedia. org / wiki / Головка блока цилиндров .
Stage2 загружает ядро в ОЗУ (опять же, с помощью дисковых утилит BIOS). Если это ядро 2.6+, в нем также есть скомпилированные initramfs, поэтому нет необходимости его загружать. Если это старое ядро, загрузчик также загружает автономный образ initrd в память, чтобы ядро могло смонтировать его и получить драйверы для монтирования реальной файловой системы с диска.
Проблема в том, что ядро (и ramdisk) весят более 1 МБ, поэтому для загрузки их в ОЗУ необходимо сначала загрузить ядро до 1 МБ, затем перейти в защищенный режим (32 бита), переместить загруженное ядро в верхнюю память (бесплатно). первые 1 МБ для реального режима), затем снова вернитесь в реальный (16-битный) режим, получите виртуальный диск с диска на первый 1 МБ (если это отдельный initrd и старое ядро), возможно, снова переключитесь в защищенный (32-битный) режим, поместите его туда, где он должен, возможно вернитесь в реальный режим (или нет: /programming/4821911/does-grub-switch-to-protected-mode ) и выполните код ядра. Предупреждение: я не совсем уверен в тщательности и точности этой части описания.
Теперь, когда вы наконец запустили ядро, у вас уже есть его и ramdisk, загруженный в RAM загрузчиком , так что ядро может использовать дисковые утилиты из ramdisk, чтобы смонтировать вашу настоящую корневую файловую систему и повернуть к ней корень. Драйверы ramfs присутствуют в ядре, поэтому он, конечно, может понимать содержимое initramfs.