Wie liest das BIOS genau den ersten Sektor

Wie liest das BIOS genau den ersten Sektor

Ich muss wissen, ob der ATA-Befehl „Read Sector“ noch verwendet wird. Ich habe im Buch „SATA Storage Technology“ gelesen, dass dieser Befehl und PIO-Einlesebefehle im Allgemeinen nur beim Startvorgang verwendet werden. Also habe ich angefangen, den Startvorgang zu untersuchen, und bin etwas verwirrt.

Ich weiß, dass das BIOS den ersten Sektor oder MBR als Teil des Bootvorgangs liest. Ich habe auch gelesen, dass das BIOS dafür INT 13 verwendet.

Das SATA-Gerät kommuniziert über HBA. Daher muss das Lesen des ersten Sektors erfolgen, nachdem der Initialisierungsprozess zwischen SATA und HBA abgeschlossen ist.

Wie liest das BIOS den ersten Sektor...

Übersetzt der HBA INT 13 in ATA-Befehle?Falls ja,
Ist hierfür nicht die Präsenz des AHCI-Treibers erforderlich?
Wann wird der Treiber geladen?

ODER

Kommuniziert das BIOS direkt mit der Festplatte?Ich denke, das ist nicht möglich.

Antwort1

Bei den Geräten gibt es Diskettenlaufwerke, SCSI, ATA, ATAPI, USB-Massenspeicher, SATA, NVME usw. Die meisten davon haben einen Controller (wobei die CPU nur mit dem Controller kommunizieren kann und der Controller mit den an den Controller angeschlossenen Geräten kommuniziert). Manchmal ist die vom Controller bereitgestellte Schnittstelle relativ standardisiert (z. B. AHCI) und manchmal nicht (SCSI, Hardware-RAID-Controller); und manchmal bietet der Controller mehrere Schnittstellen (z. B. unterstützt ein SATA-Controller möglicherweise AHCI plus ältere (P)ATA-Emulation plus eine nicht standardmäßige RAID-Schnittstelle und hat Optionen, um in den BIOS-Einstellungen auszuwählen, welche).

In allen Fällen gilt: Entweder ist im BIOS (minimaler) Treibercode integriert (wahrscheinlich für „relativ standardisierte“ Controller/Geräte und in die Hauptplatine integrierte Controller), oder im Controller ist ein „Geräte-ROM“ integriert (z. B. auf derselben PCI-Karte), das „int 0x13“ einhakt/abfängt.

In jedem Fall würde „int 0x13“ den Parameter „Gerätenummer“ verwenden, um herauszufinden, um welches Gerät es sich handelt, und zum Gerätetreibercode für dieses Gerät verzweigen.

Übersetzt der HBA INT 13 in ATA-Befehle?

Wenn ein SATA-Controller AHCI als Schnittstelle verwendet, konvertiert der Treiber „int 0x13“-Anfragen in SATA/AHCI-Befehle für HBA. Wenn ein SATA-Controller eine ältere (P)ATA-Emulation verwendet, konvertiert der Treiber „int 0x13“-Anfragen in ältere (P)ATA-Befehle, und der HBA übersetzt die ATA-Befehle in den SATA-Befehlssatz.

Ist hierfür nicht die Präsenz des AHCI-Treibers erforderlich?

Ja. Beachten Sie, dass es sich um einen minimalen Treiber handelt (der Dinge wie „Hot-Plug-SATA“, native Befehlswarteschlangen, sicheres Löschen, Auswerfen, Trimmen usw. nicht unterstützt), der der Einfachheit halber einen Ansatz verwendet, bei dem „Befehl starten, CPU-Zeit verschwenden und dabei Parallelität verhindern und die Leistung beeinträchtigen, bis der Befehl abgeschlossen ist, dann Status zurückgeben“. Diese Dinge bedeuten, dass es sich nicht um einen Gerätetreiber handelt, den ein Betriebssystem verwenden möchte.

Wann wird der Treiber geladen?

Der Treibercode ist immer irgendwo in einem ROM vorhanden (und wird nicht irgendwann von der Festplatte geladen). Der Treibercode wird entweder initialisiert, bevor die Firmware nach „Geräte-ROMs“ sucht, oder wenn die Firmware „Geräte-ROMs“ initialisiert.

Nachdem alles initialisiert wurde (vorausgesetzt, das BIOS bootet von einer normalen Festplatte, also nicht vom Netzwerk), kann das BIOS einfach „int 0x13“ verwenden, um den ersten Sektor von „dem Gerät zu laden, auf dem es sich nach der Initialisierung der Geräte-ROMs befand“.

Antwort2

Nach einigen Tests mit SATA-Analyzer stellt sich heraus, dass das BIOS oder UEFI intelligent genug ist, um langsame ATA-Befehle wieSEKTOR(EN) LESENim Bootvorgang. Stattdessen wird der ATA-BefehlLESEN DMA EXT.

Der Vollständigkeit halber ist die Reihenfolge:

Nachdem das Laufwerk seine Signatur gesendet hat, sendet der HBA den ATA-BefehlGERÄT IDENTIFIZIERENund senden Sie dannLESEN DMA EXTmit LBA = 0.

Ich bin mir jedoch nicht sicher, ob das BetriebssystemSEKTOR(EN) LESENoderSCHREIBSEKTOR(EN)auf jeden Fall während der normalen Arbeit. Ich hoffe nicht, da die Implementierung des PIO IN/OUT-Protokolls in FPGA keine angenehme Arbeit ist.

verwandte Informationen