Nun, ich werde versuchen, Ihre Frage zu beantworten. Eine ausführlichere Beschreibung des Startvorgangs finden Sie im IBM-Artikel .
Ok, ich gehe davon aus, dass Sie zur Erklärung GRUB oder GRUB2 als Bootloader verwenden. Wenn das BIOS auf Ihre Festplatte zugreift, um den Bootloader zu laden, verwendet es zunächst seine integrierten Routinen für den Festplattenzugriff, die im berühmten 13-Stunden-Interrupt gespeichert sind. Der Bootloader (und der Kernel in der Setup-Phase) verwenden diese Routinen, wenn sie auf die Festplatte zugreifen. Beachten Sie, dass das BIOS im Real-Modus (16 Bit) des Prozessors ausgeführt wird und daher nicht mehr als 2 ^ 20 Byte RAM adressieren kann (2 ^ 20 nicht 2 ^ 16), da jede Adresse im Real-Modus aus segment_address * 16 + Offset besteht (wo sowohl die Segmentadresse als auch der Offset 16-Bit sind, siehe http://en.wikipedia.org/wiki/X86_memory_segmentation ). Daher können diese Routinen nicht auf mehr als 1 MiB RAM zugreifen, was eine strenge Einschränkung und ein wesentlicher Nachteil ist.
Das BIOS lädt den Bootloader-Code direkt aus dem MBR - den ersten 512 Byte 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 Speicherplatzes befindet, der als DOS-Kompatibilitätsregion bezeichnet wird, oder von einer festen Adresse des Dateisystems. Dazu muss das Dateisystem nicht bekannt sein, da sich Phase 1.5 im Dateisystem befindet, es sich um "unformatierten" Code handelt und direkt in den Arbeitsspeicher geladen und ausgeführt werden kann: http://www.pixelbeat.org/ docs / disk / . Beim Laden der Stufe 1.5 von der Festplatte in den RAM werden BIOS-Festplattenzugriffsroutinen verwendet.
Stage1.5 enthält die Dateisystem-Dienstprogramme, so dass Stage2 vom Dateisystem gelesen werden kann (naja, es verwendet immer noch BIOS 13h, um vom Datenträger in den Arbeitsspeicher zu lesen, aber jetzt kann es Dateisysteminformationen über Inodes usw. entschlüsseln und Rohcode aus dem lesen Platte). Ältere BIOS können möglicherweise aufgrund von Einschränkungen im Festplattenadressierungsmodus nicht auf die gesamte Festplatte zugreifen. Möglicherweise verwenden sie das Cylinder-Head-Sector-System und können nicht mehr als die ersten 8 GB Festplattenspeicher adressieren: http: //en.wikipedia. org / wiki / Zylinderkopfbereich .
Stage2 lädt den Kernel in den RAM (ebenfalls mit den BIOS-Dienstprogrammen). Wenn es sich um einen 2.6+ Kernel handelt, sind auch initramfs kompiliert, sodass Sie ihn 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, so dass der Kernel es mounten und Treiber zum Mounten des realen Dateisystems von der Festplatte abrufen kann.
Das Problem ist, dass der Kernel (und die Ramdisk) mehr als 1 MiB wiegen. Um sie in den RAM zu laden, müssen Sie den Kernel zuerst auf 1 MiB laden, dann in den geschützten Modus (32 Bit) springen und den geladenen Kernel in den hohen Speicher verschieben (frei) die ersten 1 MiB für den Real-Modus), dann wieder in den Real-Modus (16 Bit) zurückkehren, die RAM-Disk von der Festplatte auf die ersten 1 MiB bringen (wenn es sich um einen separaten initrd- und älteren Kernel handelt), möglicherweise wieder in den geschützten Modus (32 Bit) wechseln, Platzieren Sie es dort, wo es hingehört, und kehren Sie möglicherweise in den Real-Modus zurück (oder nicht: /programming/4821911/does-grub-switch-to-protected-mode ), und führen Sie den Kernel-Code aus. Warnung: Ich bin nicht ganz sicher, ob dieser Teil der Beschreibung vollständig und richtig ist.
Wenn Sie den Kernel nun endlich ausführen, haben Sie ihn bereits und die RAM- Disk wurde vom Bootloader in den RAM geladen , sodass der Kernel die Festplatten-Dienstprogramme von der RAM- Disk verwenden kann, um Ihr echtes Root-Dateisystem zu mounten und das Root-Pivot darauf zu verlagern. ramfs-treiber sind im kernel vorhanden, damit er den inhalt von initramfs versteht.