I / O映射的I / O - 端口地址是RAM的一部分

时间:2014-01-02 10:48:04

标签: memory io operating-system port memory-address

在I / O映射的I / O中(与内存映射的I / O相反),I / O设备固定了一组特定的地址。这些地址是RAM的一部分,因此很多物理地址空间不可用吗?它是否与所附图片中的“硬件保留”内存相对应?

如果是,那么如何确定地址的哪些位用于寻址I / O设备(因为I / O地址空间将比实际存储器小得多。我读过这有助于减少解码电路使用的引脚/位数??

如果试图在汇编中访问属于该地址空间的任何地址,会发生什么?

'Hardware Reserved' memory

1 个答案:

答案 0 :(得分:6)

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保留给内存映射设备。要决定是否启用某些内存芯片或某些设备,只需查看A15A14的值即可。如果两个地址线都为高,则寻址的块为C000-FFFF,这意味着内存芯片使能将被置为无效。另一方面,设计人员可以决定将8位IO端口254分配给设备,并解码此地址,它只查看状态A0,不需要解码器找出端口地址(例如,这是ZX Spectrum用于解决ULA的问题)

如果一个程序(用任何允许你访问和写入任意内存位置的语言编写)试图访问为设备保留的内存地址,并假设分页和保护机制允许这样的访问,那么会发生什么取决于仅在访问该地址时设备执行的操作。 PC中众所周知的存储器映射设备是帧缓冲器。如果图形卡配置为使用其默认基址显示彩色文本模式,则对B8000B8F9F之间的物理地址执行的任何8位写操作都将导致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设备已连接到系统总线,因此只有在地址为1234hRD被声明并且IOREQ1234h时才启用它断言。这样,它就不会与MREQ处寻址的RAM芯片发生冲突,因为仅当CPU被置位时才会启用后者(IOREQ确保MREQ和{{} 1}}不能同时断言。)

这两个地址空间并不存在于所有CPU中。事实上,他们中的大多数都没有这个,因此,他们必须记忆所有设备的映射。