我需要知道 ATA 指令讀取磁區是否仍在使用。我在SATA儲存技術書籍中讀到該命令和一般PIO讀入命令僅在啟動過程中使用。所以我開始研究啟動過程,但我對此感到有些困惑。
我知道 BIOS 在啟動過程中會讀取第一個磁區或 MBR。我還讀到 BIOS 使用 INT 13 來做到這一點。
SATA 設備透過 HBA 進行通訊。因此,第一個磁區的讀取必須是在 SATA 和 HBA 之間的初始化過程完成之後。
BIOS如何讀取第一個磁區...
HBA 是否將 INT 13 轉換為 ATA 指令?如果是,
這不需要 AHCI 驅動程式的存在嗎?
驅動程式什麼時候載入?
或者
BIOS 是否直接與硬碟通訊?我認為這是不可能的。
答案1
對於設備;有軟碟、SCSI、ATA、ATAPI、USB 海量儲存、SATA、NVME 等。有時控制器提供的介面是相對標準化的(例如AHCI),有時則不是(SCSI、硬體RAID控制器);有時控制器提供多個介面(例如,SATA 控制器可能支援 AHCI,加上傳統 (P)ATA 仿真,加上非標準 RAID 介面;並且可以在 BIOS 設定中選擇哪個介面)。
對於所有情況; BIOS 內建有(最少的)驅動程式程式碼(可能用於「相對標準化」的控制器/裝置和內建於主機板中的控制器);或者控制器有一個內建的「裝置ROM」(例如在同一個PCI卡上),它掛鉤/攔截「int 0x13」。
任何狀況之下; 「int 0x13」將使用「裝置編號」參數來決定裝置是什麼,並分支到該裝置的裝置驅動程式代碼。
HBA 是否將 INT 13 轉換為 ATA 指令?
如果 SATA 控制器使用 AHCI 作為其介面;然後驅動程式會將“int 0x13”請求轉換為 HBA 的 SATA/AHCI 命令。如果 SATA 控制器使用舊版 (P)ATA 仿真,則驅動程式會將「int 0x13」要求轉換為舊版 (P)ATA 指令,然後 HBA 會將 ATA 指令轉換為 SATA 指令集。
這不需要 AHCI 驅動程式的存在嗎?
是的。請注意,它是一個最小的驅動程式(不支援「熱插拔SATA」、本機命令佇列、安全擦除、彈出、修剪等),使用「啟動命令,浪費CPU 時間,同時阻止並行性並破壞效能,直到為了簡單起見,命令完成,然後返回狀態」的方法。這些事情意味著它與作業系統想要使用的裝置驅動程式完全不同。
驅動程式什麼時候載入?
驅動程式程式碼始終存在於 ROM 中的某個位置(在某個時間點不從磁碟載入)。驅動程式代碼在韌體尋找“設備 ROM”之前或在韌體初始化“設備 ROM”時初始化。
一切初始化完畢後; (假設 BIOS 從普通磁碟啟動 - 例如,不從網路啟動)BIOS 可以僅使用“int 0x13”從“設備 ROM 初始化後最終成為的任何設備”加載第一個扇區。
答案2
使用 SATA 分析儀進行一些測試後,結果表明 BIOS 或 UEFI 足夠智能,不會使用慢速 ATA 命令,例如讀取磁區在啟動過程中。相反,它使用 ATA 命令讀取 DMA 外部。
為了完整起見,順序是:
驅動器發送簽名後,HBA 發送 ATA 命令識別設備,然後發送讀取 DMA 外部LBA = 0。
我不確定作業系統是否使用讀取磁區或者寫扇區在正常工作期間的任何情況下。我希望不會,因為在 FPGA 中實現 PIO IN/OUT 協議並不是一件令人愉快的工作。