1)在 IDENTIFY 部分,它讨论了 ATAPI 和 SATA 如何中止 IDENTIFY 命令并用识别字节填充 0x1f4 和 0x1f5,有人告诉我这对于 SATA 驱动器是错误的,我需要对此进行澄清。
如果是 SATA 驱动器,则必须连接到 SATA 控制器;和:
a) 如果 SATA 控制器处于“传统(并行)ATA 控制器仿真”模式;那么重点是它模拟了旧硬件,因此旧操作系统(不支持 SATA)仍然可以工作,所以你必须期望它可以正常工作。
b) SATA 控制器处于某种其他模式(本机模式、RAID 模式)并且不模拟传统(并行)ATA 控制器;并且您的旧(并行)ATA 控制器驱动程序根本无法工作。请注意(因为 Windows 已经支持 SATA/AHCI 超过 15 年)对于今天仍在使用的计算机来说,这是最有可能的情况。
2)如果我想使用DMA代替,PIO页面中驱动器类型的检测是否仍然相同?
是的。
进一步来说; 您识别驱动器的功能并查看它支持什么;并确定磁盘控制器支持什么,电缆支持什么(见注释)并知道你的驱动程序支持什么;然后您的驱动程序会自动选择所有 4 种事物(驱动器、电缆、控制器和驱动程序)都支持的最快选项。您不要试图做出错误的决定“无论硬件支持什么,我都会使用 UDMA 模式 2”,然后期望硬件会神奇地为您的决定增加新的支持。
注意:早在 1990 年代,并行 ATA 遇到了由并行电缆中的导线之间的串扰引起的性能障碍;因此,为了实现更快的传输速度,他们将旧的 40 芯电缆升级为 80 芯电缆(在每条“使用过的”电线之间增加了一根额外的地线,以减少串扰)。这意味着驱动器可能会说它支持更快的 PIO 和 DMA 模式(并且控制器可能支持它们);但电缆是旧的 40 芯电缆,尝试使用更快的传输模式会导致数据被电缆损坏。我不记得您是如何检测电缆类型的(我认为您检查了某种“感应”引脚,但是..)。
如果有人可以尽可能深入地解释该部分并澄清其真实性,我将非常高兴。
PCI 配置空间中的“BAR”寄存器有几个位告诉您该区域是内存映射 IO(在物理地址空间中)还是 IO 端口;并且一些位(用于“地址”)被硬连线为零,以便您可以检测区域的大小(通过将 0xFFFFFFFFF 写入 BAR 并读回以确定有多少位硬连线为零)。
请注意,此信息(设备使用的内存区域和 IO 端口)可能应该在任何 PCI 驱动程序启动之前通过 PCI 总线枚举来完成。进一步来说; 当您的驱动程序启动时,应该告诉它需要使用哪些 IO 端口和哪些内存映射区域(可能在内核被告知配置 IOMMU 和 IO 端口权限映射以允许您的驱动程序使用这些区域之后);并且您的设备驱动程序应该没有理由关心该信息是否最初来自 PCI 配置空间或来自 ISA 即插即用或来自配置脚本,或来自某些其他类型的总线(EISA,MCA,...)。
还要澄清它的真实性......
大多数 OSdev wiki 页面都是由没有经验的爱好者编写的,他们尝试阅读相关规范,可能误读/误解了某些内容,并且可能对规范的各个部分根本不感兴趣,然后写下一些东西来提供帮助(可能没有稍后硬件更改时更新它)。
使用此信息的正确方法是阅读 OSdev wiki 页面以获得一些熟悉/使自己更容易阅读规范;然后阅读规格;然后返回并修复 wiki 页面中的所有错误。大多数人跳过最后一部分。有些人跳过第一部分。
不要假设您可以单独从 wiki 页面编写驱动程序。它们不能替代实际规格。