当读写共享一个寄存器时,IDE 磁盘控制器的寄存器是否会混淆?



IDE PATA接口:0x1F7寄存器在读取时用作状态寄存器,在写入时用作命令寄存器。

但如果我首先写一个命令(即0x20(来告诉设备我想向它写一些东西,那么在下一条指令中,我会读取reg来查找状态。是否可能该reg上的位仍然是0x20,而不是我想要的状态位?

尽管端口地址相同,但内部有两个寄存器,一个命令寄存器和一个状态寄存器。输出指令写入命令寄存器,输入指令从状态寄存器读取。

I/O端口与普通内存位置不同。读取和写入是单独的事务;一个人要等到上一个结束才能开始。(这也是编程IO如此缓慢的部分原因(。此外,正如@rcgldr所解释的,在这种情况下,两个寄存器恰好共享相同的端口号,但由于一个是只读的,另一个是只写的,它们被";"方向";。

事实上,每次读取都保证是单独可见的:例如,从同一IO端口重复读取可能会从硬件缓冲区中获得数据。(事实上,这就是PIO而不是DMA读取对读取请求的数据响应的方式。(因此,从同一寄存器读取的每一个数据都可能产生副作用,硬件的设计必须尊重这一点。

这种单独的事务处理也适用于不可缓存内存(物理地址空间(中的MMIO寄存器,而不仅仅是IO地址空间(可通过in/out指令访问(-将其映射为不可缓存可以确保CPU不会在内部进行存储->负载转发。但对于in/out指令来说,这种情况绝对不会发生。(与输入/输出不同,MMIO确实允许一些流水线操作,但每个CPU写入和读取都保证对硬件单独可见。(

最新更新