我需要知道 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 等。它们大多数都有一个控制器(其中 CPU 只能与控制器通信,控制器与连接到控制器的设备通信)。有时控制器提供的接口相对标准化(例如 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 协议不是一件令人愉快的工作。