关于 ATA 的问题

Posted

技术标签:

【中文标题】关于 ATA 的问题【英文标题】:Questions about ATA 【发布时间】:2021-11-29 20:55:25 【问题描述】:

现在我想实现 ATA PIO 和 ATA DMA(PCI 总线主控)驱动程序。我为他们阅读了 OSdev wiki 页面,经过一整天的折腾,我终于对 ATA 驱动器有了很多了解,但是这些文章让我在阅读了一些部分后提出了一些问题:

1) 在 IDENTIFY 部分中,它讨论了 ATAPI 和 SATA 如何中止 IDENTIFY 命令并用识别字节填充 0x1f4 和 0x1f5,有人告诉我这对于 SATA 驱动器是错误的,我需要对此进行澄清。

2)如果我想改用 DMA,PIO 页面中对驱动器类型的检测是否仍然相同?

3)根据osdev ATA DMA页面:

总线主控寄存器的“地址”存储在磁盘控制器的 PCI 配置空间中的 BAR4 中。巴士大师 寄存器一般是一组 16 个顺序的 IO 口。它也可以 一个 16 字节的内存映射空间。

如果有人能尽可能深入地解释该部分并澄清其真实性,我将非常高兴。

【问题讨论】:

【参考方案1】:

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 页面编写驱动程序。它们不能替代实际规格。

【讨论】:

非常感谢,但我也听说该规范可能存在诸如 atapi 规范之类的问题。关于 Osdev 最难的事情是编写驱动程序。

以上是关于关于 ATA 的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于文件恢复的问题

Swift RestKit Post 不包括帖子数据

在维护数据的同时链接 Promise(角度 js)

IOCTL_ATA_PASS_THROUGH 是如何使用的?

如何获取 HDD 支持的 ATA 标准?

具有大数据的数据库与文件系统存储