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

 mobiledu2502911637 发布于 2023-02-07 09:24

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

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

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

'硬件保留'内存

1 个回答
  • 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中众所周知的存储器映射设备是帧缓冲器.如果图形卡被配置成与它的默认基址显示彩色文本模式中,执行以之间甚至物理地址的任何8位的写入操作B8000B8F9F将导致其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中都不存在这两个地址空间.实际上,他们中的大多数都没有这个,因此,他们必须对所有设备进行内存映射.

    2023-02-07 09:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有