GNU/Linux >> Znalost Linux >  >> Linux

Jak Linux načte obraz 'initrd'?

Nighphere, pokusím se odpovědět na vaši otázku, ale pro obsáhlejší popis procesu spouštění zkuste tento článek u IBM.

Dobře, předpokládám, že pro vysvětlení používáte jako zavaděč GRUB nebo GRUB2. Za prvé, když BIOS přistupuje k vašemu disku, aby nahrál bootloader, využívá své vestavěné rutiny pro přístup k disku, které jsou uloženy ve slavném 13h přerušení. Bootloader (a jádro ve fázi instalace) tyto rutiny využívá, když přistupuje na disk. Pamatujte, že BIOS běží v reálném režimu (16bitový režim) procesoru, takže nemůže adresovat více než 2^20 bajtů RAM (2^20, nikoli 2^16, protože každá adresa v reálném režimu se skládá z adresy segmentu* 16 + offset, kde adresa segmentu i offset jsou 16bitové, viz „segmentace paměti x86“ na Wikipedii). Tyto rutiny tedy nemohou získat přístup k více než 1 MiB paměti RAM, což je přísné omezení a velká nepříjemnost.

BIOS načte kód bootloaderu přímo z MBR – prvních 512 bajtů vašeho disku – a spustí jej. Pokud používáte GRUB, tento kód je GRUB fáze 1. Tento kód načte GRUB fázi 1.5, která se nachází buď v prvních 32 kB místa na disku, nazývaná oblast kompatibility DOS, nebo z pevné adresy souborového systému. K tomu nepotřebuje rozumět struktuře systému souborů, protože i když je v systému souborů fáze 1.5, je to „surový“ kód a lze jej přímo načíst do paměti RAM a spustit:Viz „Podrobnosti o GRUB na PC “ na pixelbeat.org, který je zdrojem níže uvedeného obrázku. Načtení stage1.5 z disku do RAM využívá rutiny pro přístup k disku BIOS.

Stage1.5 obsahuje nástroje souborového systému, takže může číst fázi 2 ze souborového systému (dobře, stále používá BIOS 13h ke čtení z disku do RAM, ale nyní může dešifrovat informace o souborovém systému o inodech atd., a získat nezpracovaný kód z disku). Starší BIOSy nemusí mít přístup k celému HD kvůli omezením v jejich režimu adresování disku – mohou používat systém Cylinder-Head-Sector, který nedokáže adresovat více než prvních 8GiB místa na disku:http://en.wikipedia. org/wiki/Cylinder-head-sector.

Fáze 2 načte jádro do RAM (opět pomocí diskových utilit BIOS). Pokud je to jádro 2.6+, má také zkompilovaný initramfs, takže jej není třeba načítat. Pokud se jedná o starší jádro, bootloader také nahraje samostatný obraz initrd do paměti, aby jej jádro mohlo připojit a získat ovladače pro připojení skutečného souborového systému z disku.

Problém je, že jádro (a ramdisk) váží více než 1 MiB; takže pro jejich načtení do RAM musíte načíst jádro do prvního 1MiB, pak přejít do chráněného režimu (32bitový), přesunout načtené jádro do velké paměti (uvolnit prvních 1MiB pro reálný režim), pak se vrátit opět do reálného (16bitového) režimu, dostat ramdisk z disku na prvních 1MiB (pokud je to samostatný initrd a starší jádro), případně znovu přepnout do chráněného (32bitového) režimu, dát ho tam, kam má, případně získat zpět do reálného režimu (nebo ne:https://stackoverflow.com/questions/4821911/does-grub-switch-to-protected-mode) a spusťte kód jádra. Upozornění:Nejsem si zcela jistý úplností a přesností této části popisu.

Nyní, když konečně spustíte jádro, již jej máte a ramdisk načtený do RAM pomocí bootloaderu , takže jádro může používat diskové nástroje z ramdisku k připojení vašeho skutečného kořenového souborového systému a pivotování root k němu. Ovladače ramfs jsou v jádře přítomny, takže samozřejmě rozumí obsahu initramfs.


Linux
  1. Jak zjistit, zda je disk SSD nebo HDD v Linuxu

  2. Linux – Jak linuxové jádro zná hlavní a vedlejší čísla zařízení?

  3. Linux – Obsahuje hlavička Vmlinux délku obrazu jádra?

  1. Linux – Jak lze zkontrolovat informace o struktuře adresářů souboru Unix/linux?

  2. Linux – Jak se linuxové jádro srovnává s architekturami mikrokernelu?

  3. Je možné zavést linuxové jádro bez vytvoření obrazu initrd?

  1. Jak interně funguje copy_from_user z jádra Linuxu?

  2. Jaké je srovnání linuxového jádra s mikrokernelovými architekturami?

  3. Jak si Linux zachovává kontrolu nad CPU na jednojádrovém stroji?