GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie lädt Linux das 'initrd'-Image?

Nighpher, ich werde versuchen, Ihre Frage zu beantworten, aber für eine umfassendere Beschreibung des Startvorgangs lesen Sie diesen Artikel bei IBM.

Ok, ich nehme an, dass Sie GRUB oder GRUB2 als Bootloader zur Erklärung verwenden. Zunächst einmal, wenn das BIOS auf Ihre Festplatte zugreift, um den Bootloader zu laden, verwendet es seine integrierten Routinen für den Festplattenzugriff, die im berühmten 13-Stunden-Interrupt gespeichert sind. Bootloader (und Kernel in der Setup-Phase) verwenden diese Routinen, wenn sie auf die Festplatte zugreifen. Beachten Sie, dass das BIOS im Real-Modus (16-Bit-Modus) des Prozessors ausgeführt wird und daher nicht mehr als 2 ^ 20 Bytes RAM adressieren kann (2 ^ 20, nicht 2 ^ 16, da jede Adresse im Real-Modus aus segment_address* besteht 16 + Offset, wobei sowohl die Segmentadresse als auch der Offset 16-Bit sind, siehe "x86-Speichersegmentierung" bei Wikipedia). Daher können diese Routinen nicht auf mehr als 1 MB RAM zugreifen, was eine strenge Einschränkung und eine große Unannehmlichkeit darstellt.

Das BIOS lädt den Bootloader-Code direkt aus dem MBR – den ersten 512 Bytes Ihrer Festplatte – und führt ihn aus. Wenn Sie GRUB verwenden, ist dieser Code GRUB-Stufe 1. Dieser Code lädt GRUB-Stufe 1.5, die sich entweder in den ersten 32 KB des Festplattenspeichers befindet, die als DOS-Kompatibilitätsregion bezeichnet wird, oder von einer festen Adresse des Dateisystems. Dazu muss er die Dateisystemstruktur nicht verstehen, denn selbst wenn sich Stage 1.5 im Dateisystem befindet, handelt es sich um „rohen“ Code, der direkt in den Arbeitsspeicher geladen und ausgeführt werden kann:Siehe „Details zu GRUB auf dem PC " auf pixelbeat.org, das ist die Quelle für das folgende Bild. Das Laden von stage1.5 von der Festplatte in den RAM nutzt die BIOS-Festplattenzugriffsroutinen.

Stage1.5 enthält die Dateisystem-Dienstprogramme, so dass es die Stufe 2 aus dem Dateisystem lesen kann (nun, es verwendet immer noch BIOS 13h, um von der Festplatte in den RAM zu lesen, aber jetzt kann es Dateisysteminformationen über Inodes usw. entschlüsseln und Rohcode erhalten aus der Platte). Ältere BIOS-Versionen können aufgrund von Einschränkungen in ihrem Festplattenadressierungsmodus möglicherweise nicht auf die gesamte Festplatte zugreifen – sie verwenden möglicherweise das Cylinder-Head-Sector-System und können nicht mehr als die ersten 8 GB Speicherplatz adressieren:http://en.wikipedia. org/wiki/Cylinder-head-sector.

Stufe 2 lädt den Kernel in den RAM (wieder mit BIOS-Festplattendienstprogrammen). Wenn es sich um einen 2.6+ Kernel handelt, ist auch initramfs kompiliert, sodass Sie es nicht laden müssen. Wenn es sich um einen älteren Kernel handelt, lädt der Bootloader auch ein eigenständiges initrd-Image in den Speicher, sodass der Kernel es mounten und Treiber zum Mounten eines echten Dateisystems von der Festplatte erhalten kann.

Das Problem ist, dass der Kernel (und die Ramdisk) mehr als 1 MB wiegen; Um sie also in den RAM zu laden, müssen Sie den Kernel in die ersten 1 MiB laden, dann in den geschützten Modus (32-Bit) springen, den geladenen Kernel in den hohen Speicher verschieben (die ersten 1 MiB für den Realmodus freigeben) und dann zurückkehren wieder in den realen (16-bit) Modus, ramdisk von der Platte auf die ersten 1MiB bringen (wenn es eine separate initrd und älterer Kernel ist), eventuell wieder in den geschützten (32-bit) Modus wechseln, dort hinstellen, wo er hingehört, evtl. bekommen zurück in den Real-Modus (oder nicht:https://stackoverflow.com/questions/4821911/does-grub-switch-to-protected-mode) und den Kernel-Code ausführen. Warnung:Ich bin mir über die Vollständigkeit und Genauigkeit dieses Teils der Beschreibung nicht ganz sicher.

Jetzt, wenn Sie endlich den Kernel ausführen, haben Sie ihn und die Ramdisk bereits per Bootloader in den Arbeitsspeicher geladen , sodass der Kernel Festplattendienstprogramme von der Ramdisk verwenden kann, um Ihr echtes Root-Dateisystem zu mounten und Root dorthin zu schwenken. ramfs-Treiber sind im Kernel vorhanden, sodass er natürlich den Inhalt von initramfs verstehen kann.


Linux
  1. So finden Sie unter Linux heraus, ob es sich bei der Festplatte um eine SSD oder HDD handelt

  2. Linux – Woher kennt der Linux-Kernel Geräte-Major- und Minor-Nummern?

  3. Linux – Enthält der Vmlinux-Header die Länge des Kernel-Images?

  4. Linux – Wie kann man feststellen, welches Modul den Kernel verschmutzt?

  5. Linux – Wie überprüft man die Verzeichnisstrukturinformationen einer Unix/Linux-Datei?

Wie der Linux-Kernel mit Interrupts umgeht

Wie man einen Linux-Kernel im 21. Jahrhundert kompiliert

So laden oder entladen Sie ein Linux-Kernel-Modul

So überprüfen Sie die Kernel-Version in Linux

Wie mounte ich ein Disk-Image mit mehreren Partitionen unter Linux?

Wie unterscheidet sich der Linux-Kernel von Mikrokernel-Architekturen?