So startet der Server: UEFI



Zuvor haben wir die Server-Startsequenz bereits am Beispiel des Legacy-Legacy analysiert . Jetzt ist es an der Zeit, UEFI besser kennenzulernen.



Die erste Version des heutigen Unified Extensive Firmware Interface (UEFI) wurde in den 90er Jahren des letzten Jahrtausends speziell für Intel® Itanium®-Systeme entwickelt und als Intel Boot Initiative und später als EFI bezeichnet.



Der Wunsch, den Startvorgang zu "aktualisieren", wurde erwartet. PC-BIOS , jetzt Legacy genannt, bietet an, im 16-Bit-Real-Modus zu arbeiten, adressiert nur 1 MB RAM, und der Bootloader muss sich zusammen mit der Partitionstabelle in den ersten 512 Bytes des Laufwerks befinden. Darüber hinaus überträgt das PC-BIOS die Kontrolle an den ersten gefundenen Bootloader, ohne dass die Möglichkeit einer Rückkehr besteht. In diesem Fall liegt die Bearbeitung von Fällen mit mehreren Betriebssystemen auf den Schultern des Bootloaders.



Die Größenbeschränkung des Bootloaders schreibt die Verwendung des MBR-Markups (Master Boot Record) vor, das 1983 veröffentlicht wurde. Der MBR ist nicht standardisiert, aber viele Anbieter sind "traditionell". MBR weist schwerwiegende Einschränkungen auf: Standardmäßig werden nur 4 Partitionen unterstützt, und die Speicherkapazität beträgt nicht mehr als 2,2 TB.



Im Dezember 2000 wurde die erste weit verbreitete EFI-Spezifikation unter Version 1.02 veröffentlicht. Fünf Jahre später übertrug Intel EFI in das UEFI-Forum und fügte dem Titel Unified hinzu, um die Änderung hervorzuheben. Die UEFI-Spezifikation ist öffentlich verfügbar und besteht aus mehreren Dokumenten:



  • ACPI-Spezifikation;
  • UEFI-Spezifikation;
  • UEFI-Shell-Spezifikation;
  • Spezifikation zur Initialisierung der UEFI-Plattform;
  • Verteilungspaketspezifikation für die Initialisierung der UEFI-Plattform.


Der Spaß beginnt in der UEFI-Plattforminitialisierungsspezifikation , die alle Phasen des Ladens der Plattform beschreibt.



UEFI ist universell, aber in diesem Artikel werden wir uns auf den Standard verlassen und uns mit Prozessoren auf der x86_64-Architektur befassen.



Wach auf, Neo!



UEFI-Startphasensequenz (Quelle für die UEFI-Plattforminitialisierungsspezifikation )

Nach dem Einschalten der Plattform wartet die Stromversorgung, bis die Transienten abgeschlossen sind, und setzt dann das Signal auf die Power_Good- Leitung. Der erste, der den Betrieb aufnimmt, ist nicht der Zentralprozessor, sondern die eigenständige Intel® Management Engine (ME) oder AMD Secure Technology (ST) . Dieses Subsystem führt seine eigenen Operationen aus und bereitet dann den ersten Kern eines einzelnen Prozessors vor und startet ihn, der als Bootstrap-Prozessor (BSP) bezeichnet wird .

In Übereinstimmung mit der akzeptierten Terminologie wird der Kern / Prozessor-Thread im Folgenden als Bootstrap-Prozessor oder Anwendungsprozessor bezeichnet.
Wie in Legacy beginnt der Prozessor mit der Ausführung des ersten Befehls am Ende des Adressraums bei 0xFFFFFFF0 . Diese Anweisung ist ein Sprung in die erste Phase der Plattforminitialisierung - SEC.



SEC (Sicherheits) -Phase



In dieser Phase sollten folgende Aufgaben gelöst werden:



  • Behandeln des Aktivierungsereignisses;
  • Initialisieren von genügend Speicher für die nächste Phase;
  • die Wurzel des Vertrauens in das System schaffen;
  • Übertragung der notwendigen Informationen und Kontrolle in die nächste Phase.


X86_64-Prozessoren starten im 16-Bit-Real-Modus , und während der anfänglichen Initialisierung wird der BSP in den 32-Bit-geschützten Modus versetzt . Anschließend wird der Mikrocode aller verfügbaren Prozessoren aktualisiert.



Als nächstes folgt die Verarbeitung des Aktivierungsereignisses. Dies bedeutet die Zusammenfassung von Informationen über den Zustand der Ausrüstung, so dass einige Module in der nächsten Phase Rückschlüsse auf den "Zustand" und den allgemeinen Zustand der Plattform ziehen können.



Während der SEC-Phase findet keine RAM-Initialisierung statt. Stattdessen wird der freie Prozessor-Cache als nicht spülbar markiert und in temporären RAM konvertiert. Dieser Modus wird als No-Eviction-Modus (NEM) bezeichnet.... Im zugewiesenen Speicher wird ein Stapel erstellt, der es Modulen aus den nächsten Phasen ermöglicht, Stapelprogrammiersprachen zu verwenden, bevor der Haupt-RAM initialisiert wird.



Ferner werden alle Anwendungsprozessoren (Anwendungsprozessoren, AP) mit einer speziellen Folge von Interprozessor-Interrupts (Inter-Prozessor-Interrupt, IPI) initialisiert, die an sie gesendet werden. Die Init IPI-Sequenz - Start IPI - aktiviert den Anwendungsprozessor und startet den integrierten Selbsttest (BIST) . Die Testergebnisse werden aufgezeichnet und zur Analyse weitergeleitet.



Am Ende der Sicherheitsphase müssen Sie den Abschnitt Boot Firmware Volume (BFV) finden, auf dem sich der ausführbare Code der nächsten Phase befindet, und, wenn möglich, andere kleinere Abschnitte mit dem Code (Firmware Volume, FV) zu finden.



Um den Namen der Sicherheitsphase zu rechtfertigen und eine Vertrauensbasis zu werden, kann während der Ausführung dieser Phase der Code, auf den wir die Kontrolle übertragen möchten, auf nicht autorisierte Änderungen und böswillige Teile des Programms überprüft werden.



Am Ende der SEC-Ausführung werden die folgenden Informationen gesammelt:



  • Größe und Adresse des Boot Firmware Volume (BFV);
  • die Größe und Adressen anderer Firmware-Volumes (FV);
  • Größe und Adresse des temporären RAM;
  • die Größe und Adresse des Stapels.


Dann beginnt die nächste Phase - Pre-EFI-Initialisierung.



PEI-Phase (Pre EFI Initialization)



Die PEI-Phase auf einem SuperMicro-Motherboard

Der Zweck der Phase vor der EFI-Initialisierung besteht darin, Informationen zu angeschlossenen Geräten zu sammeln und die minimal erforderliche Hardwaremenge vorzubereiten, um den vollständigen Initialisierungsprozess auszuführen.



Die PEI-Phase sollte konstruktionsbedingt leicht sein, da der Prozessor-Cache-Speicher begrenzt ist. Darüber hinaus kann die PEI-Phase nach einem Fehler wiederhergestellt werden, sodass der PEI-Phasencode in einem stabileren Speicher abgelegt werden muss.



Diese Phase besteht aus einem Kern namens PEI Foundation und den PEI Module (PEIM) Plugins . Der zentrale Teil des Kernels ist der Modulmanager PEI Dispatcher, die die Reihenfolge der Ausführung von Modulen steuert und auch die Interaktion zwischen Modulen organisiert (PEIM-zu-PEIM-Schnittstelle, PPI).



Beachten Sie, dass die SEC-Phase aus dem Flash-Speicher auf der Hauptplatine ausgeführt wurde und nur zu Beginn des PEI der für diese Phase erforderliche ausführbare Code in den temporären Direktzugriffsspeicher kopiert wird.



Als nächstes kommt der PEI Dispatcher. PEI-Module werden in einer bestimmten Reihenfolge gestartet: zuerst Module ohne Abhängigkeiten, dann abhängig von der ersten usw., bis die Module leer sind.



Die Architektur der PEI-Phase ermöglicht es Ihnen, eigene Module zu entwickeln, die die Ergebnisse ihrer Aktivitäten in die nächste Phase übertragen können. Die Informationsübertragung erfolgt über eine spezielle HOB- Datenstruktur (Hand-off Block) .



Beachten Sie beim Starten von PEI-Modulen Folgendes:



  • CPU PEIM - Prozessorinitialisierung;
  • Plattform PEIM - Initialisierung der Brücken North (einschließlich Memory Controller Hub) und South (I / O Controller Hub);
  • Speicherinitialisierung PEIM - Initialisierung des Haupt-RAM und Übertragung von Daten vom temporären Speicher zum RAM.


Zuvor wurde die Aufnahme aus der SEC-Phase erhalten. Wenn das Einschaltereignis S3 Resume lautet, wird als Nächstes S3 BootScript ausgeführt , wodurch der gespeicherte Status der Prozessoren und aller angeschlossenen Geräte wiederhergestellt und die Steuerung direkt an das Betriebssystem übertragen wird.

Der S3- Zustand (Suspend to RAM) ist ein Ruhezustand, in dem der Prozessor und ein Teil des Chipsatzes mit einem Kontextverlust heruntergefahren werden. Nach dem Erwachen aus diesem Zustand beginnt der Prozessor mit der Ausführung, als wäre es ein normales Einschalten. Anstatt jedoch vollständig zu initialisieren und alle Tests zu bestehen, kann das System nur den Status aller Geräte wiederherstellen.
Beim Starten aus einem anderen Zustand wird die Steuerung in die Phase der Treiberausführungsumgebung übertragen.



DXE-Phase (Driver eXecution Environment)



DXE-

Phase AHCI-Initialisierung Die DXE- Phase (Driver Execution Environment) konzentriert sich auf die Initialisierung der verbleibenden Geräte. Zu Beginn der DXE-Phase sind der Prozessor und der Hauptspeicher betriebsbereit, und die DXE-Treiber unterliegen keinen strengen Ressourcenbeschränkungen.



Ähnlich wie bei der PEI Foundation hat diese Phase einen eigenen Kern - die DXE Foundation . Der Kernel erstellt die erforderlichen Schnittstellen und lädt drei Arten von DXE-Diensten:



  • UEFI-Bootdienste - Startzeitdienste;
  • UEFI Runtime Services - Laufzeitdienste ;
  • DXE-Dienste sind spezielle Dienste, die vom DXE-Kern benötigt werden.


Nach der Initialisierung der Dienste beginnt der DXE Dispatcher zu arbeiten . Es findet und lädt DXE-Treiber, die wiederum die Hardware-Initialisierung abschließen.

In UEFI gibt es keine dedizierte Phase, in der die Hardware den POST (Power-On Self-Test) besteht. Stattdessen führt jedes PEI- und DXE-Phasenmodul seine eigenen Tests durch und teilt diese in den folgenden Phasen über POST-Codes dem Benutzer und über HOBs mit.
Unter den vielen geladenen Treibern auf x86_64-Prozessoren lohnt es sich, auf den SMM Init-Treiber (System Management Mode Init) zu achten. Dieser Treiber bereitet alles für den System Management Mode (SMM) vor . SMM ist ein spezieller privilegierter Modus, mit dem Sie die Ausführung des aktuellen Codes (einschließlich des Betriebssystems) unterbrechen und das Programm aus dem geschützten Bereich von SMRAM in seinem eigenen Kontext ausführen können .

SMM wird inoffiziell als der -2 -Schutzring angesehen . Der Betriebssystemkern läuft auf Ring 0, und die eingeschränkteren Schutzringe sind von 1 bis 3 nummeriert. Offiziell wird Ring Null als der privilegierteste angesehen. Ein hardwarevirtualisierter Hypervisor wird jedoch üblicherweise als Ring -1 bezeichnet, und Intel ME und AMD ST werden als Ring -3 bezeichnet.
Zusätzlich beachten wir das Compatibility Support Module (CSM) , das die Kompatibilität mit Legacy gewährleistet und es Ihnen ermöglicht, das Betriebssystem ohne UEFI-Unterstützung zu starten. Wir werden uns dieses Modul später genauer ansehen.



Nach der Initialisierung aller Geräte ist es Zeit, ein Startgerät auszuwählen.



BDS-Phase (Boot Device Select)



In der Phase Boot Device Select wird die Startrichtlinie der UEFI-Anwendung implementiert. Obwohl dies eine separate Phase ist, bleiben alle während der DXE-Phase erstellten Dienste, einschließlich des Dispatchers, verfügbar.



Der Zweck der BDS-Phase besteht darin, die folgenden Aufgaben zu erfüllen:



  • Initialisierung von Konsolengeräten;
  • Suchen Sie nach Geräten, von denen Sie booten können.
  • Ein Versuch, von gefundenen Geräten in der Reihenfolge ihrer Priorität zu booten.


PCIe-BIOS der LSI-Zusatzkarte

Der Boot-Manager sucht nach bootfähigen Bereichen auf Geräten. Einige Erweiterungskarten, wie z. B. Netzwerkkarten und RAID-Controller, verfügen möglicherweise über ein eigenes "BIOS", das als Option ROM oder OpROM bezeichnet wird . Der Inhalt der OpROM-Geräte wird unmittelbar nach der Erkennung gestartet, und nach der Ausführung kehrt die Steuerung zum Boot-Manager zurück.



Alle Partitionen mit Downloadbereichen werden im Speicher des Bootmanagers gespeichert und gemäß der Bootreihenfolge sortiert. Wenn keine Anwendungen gefunden werden, kann Boot Manager den DXE-Dispatcher aufrufen, falls der Dispatcher während der Suche zusätzliche Treiber geladen hat und neue Geräte möglicherweise für den Boot-Manager "geöffnet" werden.



Wie bereits erwähnt, führt die Verwendung des Master Boot Record-Markups zu Einschränkungen hinsichtlich der Größe der Partitionen und ihrer Anzahl auf dem Laufwerk sowie zu bestimmten Unannehmlichkeiten bei der Wartung mehrerer Betriebssysteme. Die Lösung all dieser Probleme ist Teil der UEFI-Spezifikation - GUID-Partitionstabelle.



GPT (GUID-Partitionstabelle)



Die GUID-Partitionstabelle ist ein standardisiertes Partitionstabellenformat, das den alten MBR ersetzt.



Erstens verwendet GPT die logische Blockadressierung (LBA) anstelle der Zylinder-, Kopf- und Sektoradressierung (CHS). Durch Ändern der Adressierungsmethode kann GPT mit Laufwerken mit bis zu 9,4 ZB (9,4 * 10 21 Byte) gegenüber 2,2 TB für MBR arbeiten.



Zweitens wurde die Partitionstabelle geändert, und jetzt können Sie bis zu 2 64 Partitionen auf einem Laufwerk erstellen , obwohl Betriebssysteme unter Microsoft Windows nicht mehr als 128 und unter Linux 256 unterstützen.



Drittens hat jeder Abschnitt eine eigene Typkennung, die den Zweck des Abschnitts beschreibt. So verweist beispielsweise die Kennung C12A7328-F81F-11D2-BA4B-00A0C93EC93B eindeutig auf die EFI-Systempartition (ESP), von der der Boot-Manager versuchen kann, die Anwendung zu laden.



Während der Entwicklung von GPT wurde die Kompatibilität mit dem MBR nicht verschont. Festplatten-Dienstprogramme erkennen die GPT-Festplatte möglicherweise nicht und löschen sie. Um dies zu vermeiden, werden während der GPT-Partitionierung die ersten 512 Bytes mit Protective MBR (Protective MBR) gefüllt - einer Partition von einer Partition auf das gesamte Laufwerk mit der Systemkennung 0xEE. Dieser Ansatz ermöglicht es UEFI zu verstehen, dass es sich nicht um einen echten MBR handelt, sondern um alte Software ohne GPT-Unterstützung, um eine Partition mit Daten eines unbekannten Typs anzuzeigen.



GPT hat den Startbereich zugunsten von ESP-Partitionen verworfen, die als bootfähig erkannt werden. Der Boot Manager sammelt Informationen zu allen ESPs auf der Festplatte, sodass Sie mehrere Bootloader ohne Konflikte auf dem Laufwerk haben können, einen für jeden ESP.



Laden des Betriebssystems



Nachdem alle Geräte abgefragt und nach Startbereichen gesucht wurden, startet der Boot Manager den Start in der Reihenfolge der Startprioritäten. Im Allgemeinen wird die Steuerung an die UEFI-Anwendung übertragen, die mit der Ausführung ihrer Logik beginnt. Bei Systemen mit Legacy-Modus-Kompatibilität befindet sich möglicherweise ein MBR in der Liste der Startbereiche, und Sie müssen zum CSM, dem Modul zur Unterstützung der Kompatibilität, wechseln.



Mit dem CSM können Sie Betriebssysteme ausführen, die UEFI nicht unterstützen. Um solche Betriebssysteme zu laden, emuliert das CSM-Modul die Umgebung, in die das "klassische" Betriebssystem fällt:



  • lädt den Legacy-Treiber;
  • lädt Legacy-BIOS;
  • Versetzt die Videoausgabe in den Legacy-kompatiblen Modus.
  • Erstellt Datenstrukturen, die für Legacy im Speicher erforderlich sind und in UEFI nicht verfügbar sind.
  • Lädt den CompatibilitySmm-Treiber, damit SMM in Legacy funktioniert.


Denken Sie daran, dass im Legacy-Modus das Betriebssystem im 16-Bit-Modus gestartet wird, während im UEFI alles im 32-Bit-Modus funktioniert. CSM startet den Legacy-Bootloader im 16-Bit-Modus und ermöglicht bei Bedarf die Kommunikation mit 32-Bit-UEFI-Treibern.



Phase RT (Laufzeit)



Der Start des Betriebssystem- oder Legacy-Bootloader-Starts führt zum Start der Laufzeitphase. In dieser Phase sind nicht mehr alle DXE-Dienste (außer UEFI Runtime Services) verfügbar.



Der Inhalt der RT-Phase kann variieren. Möglicherweise gibt es einen aus Legacy bekannten Betriebssystemlader, z. B. GRUB2 oder Windows Boot Manager, der den Prozessor in den 64-Bit-Modus versetzt und das Betriebssystem startet. Es kann jedoch gleichzeitig unabhängige Anwendungen oder den Kernel des Betriebssystems geben.



Der Linux-Kernel ab Version 3.3 wird, wenn das Flag CONFIG_EFI_STUB vorhanden ist, zu einer regulären UEFI-Anwendung und kann von UEFI ohne Verwendung von Bootloadern von Drittanbietern gestartet werden.



Wie im Fall des Legacy muss der Bootloader oder der Kernel selbst den Prozessor in den 64-Bit-Modus versetzen, alle Treiber laden, den Scheduler konfigurieren und init ausführen. Init startet wiederum Prozesse im Benutzerbereich, woraufhin das Anmeldefenster des Betriebssystems angezeigt wird.



Fazit



Das Booten zu UEFI ist ein komplexerer, aber standardisierter und weitgehend universeller Prozess. Die Ähnlichkeiten mit Legacy werden nur allgemein beobachtet, und der Teufel steckt, wie Sie wissen, im Detail.



Wie schnell wird es Ihrer Meinung nach möglich sein, Legacy vollständig zu verlassen?

Schreiben Sie Ihre Meinung in die Kommentare.



All Articles