Was sind die tatsächlichen Schritte, um den ersten laufenden Kernel zu erstellen, vorausgesetzt, Sie haben eine Reihe von C-Headerdateien, die die speicherzugeordneten Geräte in Ihrem System beschreiben? Ich weiß, dass jeder einfach von einer Live-CD/einem USB-Stick usw. bootet, aber wie wurde dieser erste Bootstrap erstellt?
BEARBEITEN: Ich sollte darauf hinweisen, dass ich wirklich über ARM-Geräte spreche. Ich verstehe die Grundlagen des Ladens über das BIOS auf einer typischen Maschine, aber nehmen wir an, wir sprechen über ein benutzerdefiniertes Gerät?
Antwort1
wie kam es zur Herstellung des ersten Bootstrap?
Das Erstellen (Schreiben und Cross-Kompilieren) eines Bootstrap-Programms ist nicht so schwierig, wie Sie anzudeuten scheinen.
Ich sollte darauf hinweisen, dass ich wirklich über ARM-Geräte spreche. Ich verstehe die Grundlagen des Ladens über das BIOS auf einem typischen Computer, aber nehmen wir an, wir sprechen über ein benutzerdefiniertes Gerät?
Das BIOS, auf das Sie sich beziehen, ist im Wesentlichen eine PC-Konvention. (CP/M hatte auch ein BIOS, aber es befand sich nicht unbedingt im nichtflüchtigen Speicher.) ARM-CPUs haben oder verwenden normalerweise kein BIOS.
Der heute verwendete ARM-Prozessor ist mit Peripheriegeräten auf einem einzigen IC integriert, einem sogenanntenSoC, System auf einem Chip. Hauptspeicher, z. B. DRAM, und nichtflüchtiger Speicher, z. B. NAND-Flash, befinden sich normalerweise außerhalb des SoC, um maximale Designflexibilität zu gewährleisten. Normalerweise gibt es jedoch einen kleinen (vielleicht 128 KB) eingebetteten ROM (Nur-Lese-Speicher), um die minimalen Systemkomponenten zu initialisieren und Bootstrap-Operationen zu starten. Ein Prozessor-Reset führt immer zur Ausführung dieses Boot-ROM. (Dieses ROM ist wirklich schreibgeschützt und kann nicht geändert werden. Der Code wird während der Chipherstellung in das Silizium maskiert.)
Jeder SoC-Anbieter hat seine eigene Bootstrap-Methode, um das Betriebssystem zu laden und auszuführen. Einige verwenden Hardware-Strapping, um GPIO-Pins zu lesen und so die Quelle der nächsten Stufe der Bootstrap-Sequenz zu ermitteln. Ein anderer Anbieter verwendet möglicherweise eine geordnete Liste von Speichern und Geräten, um nach einem Bootstrap-Programm zu suchen. Eine andere Technik besteht darin, zur Firmware im NOR-Flash zu verzweigen, die direkt ausgeführt werden kann (d. h. XIP, Ausführung an Ort und Stelle).
Eines der Probleme beim Bootstrapping eines Systems, das DRAM als Hauptspeicher verwendet, ist die Hardware-Initialisierung. Der DRAM-Speichercontroller muss initialisiert werden, bevor Code in DRAM geladen und ausgeführt werden kann. Wo befindet sich dieser Initialisierungscode, wenn er nicht im Hauptspeicher sein kann?
Jeder Anbieter hat seine eigene Lösung. Einige erfordern, dass Speicherkonfigurationsdaten im nichtflüchtigen Speicher gespeichert werden, damit das Boot-ROM darauf zugreifen kann. Einige SoCs verfügen über integriertes SRAM (das im Gegensatz zu DRAM keine Initialisierung erfordert), um ein kleines Bootstrap-Programm auszuführen. Einige SoCs verwenden NOR-Flash, um ein XIP-Bootstrap-Programm zu speichern.
Sobald das Bootstrapprogramm den DRAM initialisiert hat, kann der Hauptspeicher zum Laden der nächsten Bootphase verwendet werden. Dies könnte ein anspruchsvolles Bootprogramm wie U-Boot oder (sofern das Bootstrapprogramm dazu in der Lage ist) der Linux-Kernel sein. Beachten Sie, dass zwischen dem Zurücksetzen des Prozessors und der Ausführung des Betriebssystems möglicherweise mehrere Bootstrapprogramme oder -phasen ausgeführt werden müssen.
Die Anforderungen zum Booten des Linux ARM-Kernels sind im folgenden Dokument aufgeführt:http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html
Ältere Versionen von Linux ARM verwendeten die ATAGs-Liste, um grundlegende Konfigurationsinformationen an den Kernel weiterzugeben. Moderne Versionen bieten eine vollständige Boardkonfiguration mithilfe einer kompilierten Binärdatei eines Gerätebaums.
Natürlich kann die Frage „Wie erstellt man einen Bootstrap?“ nicht ohne einige Qualifikationen beantwortet werden.
Wie das PC-BIOS ist auch das Boot-ROM von SoCs proprietär und wird nicht freigegeben (es sei denn, Sie unterzeichnen eine Geheimhaltungsvereinbarung, wenn überhaupt). Der Großteil des anderen Boot-Codes wird jedoch unter GPL oder einer ähnlichen Lizenz freigegeben und ist leicht erhältlich.
NACHTRAG
Da Sie jetzt erwähnen, dass Sie einen Zynq 7000 verwenden (der einen Xilinx SoC verwendet), hat Xilinx ein Video-Tutorial zuSo erstellen Sie ein Linux-Boot-Image.
Dieses Video bestätigt, was ich bereits geschrieben habe:
1. Der Xilinx SoC hat ein eingebettetes Boot-ROM (das technisch gesehen die erste Stufe ist, aber häufiger ignoriert oder als Stufe Null bezeichnet wird).
2. Es gibt „Modus-Pins“, um die Quelle des Bootstrap-Programms für die nächste Stufe anzugeben.
3. Das Boot-ROM lädt ein Bootstrap-Programm (das technisch gesehen die zweite Stufe ist, aber häufig als „erste“ Stufe bezeichnet wird), genannt FSBL, in das eingebettete SRAM. Dieses Programm initialisiert DRAM und lädt die nächste Stufe, U-Boot.
4. U-Boot wird aus dem DRAM ausgeführt und lädt den Linux-Kernel.
Das Video zeigt, dass der FSBL-Quellcode von der Xilinx-Website heruntergeladen und in wenigen Schritten plattformübergreifend kompiliert werden kann. Es gibt keine"Trick"wie Sie behaupten. Der Build ist eine unkomplizierte Konfiguration und Cross-Kompilierung, die ich einfacher/leichter finde als das typische Anwendungspaket.
Vielleicht beruht Ihre Verwirrung auf der Mehrdeutigkeit des Startmediums, d. h. die Quelle(n) der Startabbilder wurde(n) nicht angegeben. Das Video erwähnt NAND-Flash und SD-Karte als mögliche Startgeräte.
Das Start-ROM wird angewiesen, das FSBL-Abbild von einem Quellmedium zu lesen, wie durch die Modus-Pins konfiguriert.
Das FSBL (wenn es wie andere Bootstraps ist, die ich verwendet habe) ist so aufgebaut, dass es U-Boot von einem konfigurierten Quellmedium liest. Es gibt keine Laufzeitalternative.
U-Boot macht seinem Namen alle Ehre („universell“) und kann (mithilfe von Umgebungsvariablen) so konfiguriert werden, dass Bilder (und Skripte) von verschiedenen Geräten geladen werden. Es gibt auch eine interaktive Option.
Siehe auch das Xilinx Wiki aufZynq Linux, in der es heißt, dass "vollständige Informationen zum Booten von Zynq in derTechnisches Referenzhandbuch".