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, цей код є етапом 1. GRUB. Цей код завантажує етап GRUB 1.5, який розташований або в першому 32 КБ дискового простору, який називається областю сумісності DOS, або з фіксованої адреси файлової системи. Для цього не потрібно розуміти файлову систему, тому що навіть є етап 1.5 у файловій системі, це "сирий" код і може бути безпосередньо завантажений в оперативну пам'ять та виконаний: http://www.pixelbeat.org/ docs / диск / . Завантаження етап1.5 з диска в оперативну пам'ять використовує підпрограми доступу до диска BIOS.
Stage1.5 містить утиліти файлової системи, так що вона може читати stage2 з файлової системи (ну, вона все ще використовує BIOS 13h для читання з диска на оперативну пам’ять, але тепер вона може розшифрувати інформацію про файли в індексах і т.д. диск). Старіші BIOS можуть не мати доступу до всього HD через обмеження в режимі адресації їхніх дисків - вони можуть використовувати систему Cylinder-Head-Sector, не в змозі вирішити більше, ніж перші 8 Гб дискового простору: http: //uk.wikipedia. org / wiki / Циліндр-головний сектор .
Stage2 завантажує ядро в оперативну пам'ять (знову ж таки, використовуючи дискові утиліти BIOS). Якщо це ядро 2.6+, воно також містить initramfs, зібрані всередині, тому не потрібно його завантажувати. Якщо це більш старе ядро, завантажувач також завантажує в пам'ять окреме зображення initrd, щоб ядро могло його змонтувати та отримати драйвери для монтажу реальної файлової системи з диска.
Проблема полягає в тому, що ядро (і ramdisk) важать більше 1 МіБ, таким чином, щоб завантажити їх в оперативну пам’ять, ви повинні завантажити ядро спочатку на 1 МіБ, потім перейти в захищений режим (32 біт), перемістити завантажене ядро у високу пам'ять (безкоштовно перший 1 Мб для реального режиму), потім знову поверніться до реального (16 бітового) режиму, отримайте рамковий диск з диска на перший 1 МБ (якщо це окремий інітарій та старіше ядро), можливо, знову перейдіть у захищений (32 бітний) режим, помістіть його туди, куди належить, можливо поверніться до реального режиму (чи ні: /programming/4821911/does-grub-switch-to-protected-mode ) та виконайте код ядра. Попередження: Я не зовсім впевнений у ґрунтовності та точності цієї частини опису.
Тепер, коли ви, нарешті, запустите ядро, у нього вже є і ramdisk завантажений в оперативну пам'ять завантажувачем , тому ядро може використовувати дискові утиліти з ramdisk для монтажу вашої реальної кореневої файлової системи та підключення до неї кореня. драйвери ramfs присутні в ядрі, тому він, зрозуміло, може зрозуміти вміст initramfs.