现在我想实现ATA PIO和ATA DMA (PCI总线主控)驱动程序。我为他们阅读了OSdev的wiki页面,在花了整整一天的时间之后,我终于了解了很多ATA驱动器的内容,但是这些文章让我在阅读了一些部分之后提出了一些问题:
1)在“标识”一节中,它讨论了ATAPI和SATA是如何中止标识命令并使用标识字节填充0x1f4和0x1f5的,有人告诉我,对于SATA驱动器来说,这是错误的,我需要澄清这一点。
(2)如果我想使用DMA,那么PIO页面中的驱动器类型检测结果是否仍然相同?
3)根据osdev ATA DMA页面:
总线主寄存器的“地址”存储在BAR4中,存储在磁盘控制器的PCI配置空间中。总线主寄存器通常是由16个顺序IO端口组成的一组。它也可以是一个16字节内存映射空间。
如果有人能尽可能深入地解释这一节,并澄清它的真实性,我将非常高兴。
发布于 2021-10-11 06:47:07
(
1)在“标识”部分,它讨论了ATAPI和SATA是如何中止标识命令并使用标识字节填充0x1f4和0x1f5的,有人告诉我,对于SATA驱动器来说,这是错误的,我需要澄清这一点。
如果它是SATA驱动器,那么它必须连接到SATA控制器;并且:
( a)如果SATA控制器处于“遗留(并行) ATA控制器仿真”模式,那么整个问题是它模拟旧硬件,以便旧操作系统(不支持SATA)仍然工作,因此您必须期待它的工作方式相同。
( b) SATA控制器处于其他模式(本机模式、RAID模式),没有模拟遗留(并行) ATA控制器;您的遗留(并行) ATA控制器驱动程序根本无法工作。请注意(因为Windows支持15+年的SATA/AHCI ),这是目前仍在使用的计算机最有可能出现的情况。
2)如果我想要使用DMA,那么PIO页面中的驱动器类型检测是否仍然相同?
是。
更具体地说,您可以识别驱动器的功能并查看它支持什么;确定磁盘控制器支持什么、电缆支持什么(请参阅注),并知道您的驱动程序支持什么;然后您的驱动程序自动选择所有4种设备(驱动器、电缆、控制器和驱动程序)支持的最快选项。您不会试图做出错误的决定:“我将使用UDMA模式2,而不管硬件支持什么”,然后期望硬件神奇地为您的决策提供新的支持。
注:早在上世纪90年代,平行ATA就遇到了一个性能障碍,这是由平行电缆中的电线间的交叉通话造成的;因此,为了加快传输速度,他们将旧的40导体电缆升级为80导体电缆(在每条“二手”导线之间增加一条地线,以减少交叉通话)。这意味着驱动器可能表示它支持更快的PIO和DMA模式(控制器可能支持它们);但是电缆是一种旧的40导体电缆,试图使用更快的传输模式将导致数据被电缆破坏。我不记得你是如何发现电缆类型的(我认为有某种“感觉”的针你检查,但是.)。
,如果有人能尽可能深入地解释这一节,并且澄清它的真实性,我会非常高兴的。
PCI配置空间中的" BAR“寄存器有几个位,可以告诉您该区域是内存映射的IO (在物理地址空间中)还是IO端口;其中一些位(用于”地址“)是硬连接到零,以便您可以检测该区域的大小(方法是将0xFFFFFFFF写入该条并将其读回以确定硬连接到零的位数)。
请注意,在启动任何PCI驱动程序之前,可能应该通过PCI总线枚举来完成此信息(哪些内存区域/s和设备使用的IO端口)。更具体地说,当驱动程序启动时,一些东西应该告诉它需要使用哪些IO端口和哪些内存映射区域(可能是在内核被告知配置IOMMU和IO端口权限映射以允许驱动程序使用这些区域之后);设备驱动程序不应该关心这些信息最初是来自PCI配置空间、ISA即插即用还是来自配置脚本,还是来自其他类型的总线(EISA、MCA、.)。
还澄清了它的真实性..。
大多数OSdev wiki页面是由没有经验的爱好者编写的,他们试图阅读相关规范,可能误读/误解了一些东西,对规范的各个部分可能根本不感兴趣,然后写下一些东西来提供帮助(可能在后来硬件发生变化时不会对其进行更新)。
使用此信息的正确方法是阅读OSdev wiki页面以获得一些熟悉/使自己更容易阅读规范;然后阅读规范;然后返回并修复wiki页面中的所有错误。大多数人跳过了最后一部分。有些人跳过了第一部分。
不要假设您可以单独从wiki页面/s编写驱动程序。它们不能代替实际的规格。
https://stackoverflow.com/questions/69520572
复制相似问题