在I/O映射的I/O中(与内存映射的I/O相反),I/O设备固定了一组特定的地址.这些地址是RAM的一部分,因此很多物理地址空间不可用吗?它是否与所附图片中的"硬件保留"内存相对应?
如果是,那么如何确定地址的哪些位用于寻址I/O设备(因为I/O地址空间将比实际存储器小得多.我读过这有助于减少引脚数量/解码电路使用的比特)?
如果试图在汇编中访问属于该地址空间的任何地址,会发生什么?
I/O映射I/O不使用与内存映射I/O相同的地址空间.后者确实使用RAM通常使用的部分地址空间,因此"窃取"不再属于RAM存储器的地址.
不同内存映射I/O使用的地址范围集称为"硬件保留".
关于如何决定如何处理内存映射设备,这在很大程度上由PnP子系统覆盖,无论是在BIOS中还是在SO中.内存映射设备(少数例外)是PnP设备,因此这意味着对于每个设备,其基地址都可以更改(对于PCI设备,存储器映射寄存器的基地址,如果有的话)包含在BAR中-Base Address Register-,它是PCI配置空间的一部分).
在早期的8位系统上完成了用于解码设备的保存引脚(延迟解码),以节省解码器并降低成本.它与内存映射/ IO映射设备无关.可以在两种情况下使用延迟解码.例如,设计人员可以决定将16位地址范围C000-FFFF
保留给内存映射设备.要决定是否启用一些内存芯片,或者一些设备,这是不够看的价值A15
和A14
.如果两个地址线都很高,那么寻址的块就是C000-FFFF
,这意味着存储器芯片使能将被置为无效.另一方面,设计人员可以决定将8位IO端口254
分配给设备,并解码此地址,它只查看状态A0
,不需要解码器来查找端口地址(这是例如,ZX Spectrum为解决ULA做了什么
如果一个程序(用任何允许你访问和写入任意内存位置的语言编写)试图访问为设备保留的内存地址,并假设分页和保护机制允许这样的访问,那么会发生什么将完全取决于什么访问该地址时设备会执行此操作.PC中众所周知的存储器映射设备是帧缓冲器.如果图形卡被配置成与它的默认基址显示彩色文本模式中,执行以之间甚至物理地址的任何8位的写入操作B8000
和B8F9F
将导致其ASCII代码写入到在屏幕上显示的值,字符的位置即取决于所选地址.
I/O映射设备不会与内存冲突,因为它们使用不同的地址空间,使用不同的指令来读取和写入地址(端口)的值.无法使用针对内存的机器代码指令来寻址这些设备.
内存映射设备与RAM共享地址空间.根据系统配置,内存映射寄存器可以一直存在,使用一些地址,从而阻止系统将它们用于RAM,或者内存映射设备有时可能"遮蔽"内存,因此允许程序更改I/O配置,用于选择某个存储区域是否会被设备使用解码,或者由常规RAM使用(例如,Commodore 64允许用户拥有64KB RAM但允许其访问设备寄存器)有时,通过暂时禁止访问位于该同一地址当前正在访问的设备"后面"的RAM.
在硬件层面,正在发生的是有两种不同的信号:MREQ和IOREQ.第一个在每个I/O insruction上的每个存储器指令上断言,第二个.所以这段代码......
MOV DX,1234h MOV AL,[DX] ;reads memory address 1234h (memory address space) IN AL,DX ;reads I/O port 1234h (I/O address space)
两者都将值1234h
放在CPU地址总线上,并且都断言RD
引脚以指示读取,但第一个将断言MREQ
以指示该地址属于存储器地址空间,第二个将断言IOREQ
以指示它属于的I/O
地址空间.的I/O
在端口设备1234h
,这样,如果该地址被它仅启用被连接到系统总线1234h
,RD
被断言以及IOREQ
被断言.这样,它就不会与寻址的RAM芯片发生冲突1234h
,因为后者只有在MREQ
被断言时才会启用(CPU
确保IOREQ
并且MREQ
不能同时置位).
所有CPU中都不存在这两个地址空间.实际上,他们中的大多数都没有这个,因此,他们必须对所有设备进行内存映射.