IO端口和IO Space的关系
有谁能帮忙具体解释下IO端口和IO Space的关系?访问CMOS的端口是70/71,它的IO Space空间是多少?为什么读cmos时要outputb(70,index),inputb(71),而不是直接将in al,address
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有谁能帮忙具体解释下IO端口和IO Space的关系?访问CMOS的端口是70/71,它的IO Space空间是多少?为什么读cmos时要outputb(70,index),inputb(71),而不是直接将in al,address
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
你试过用in,out汇编指令操作吗?结果如何呢?
IO 端口和 IO Space 的关系,其实就和 “虚拟地址和地址空间” 的关系一样。
例:虚拟地址 00401000 在 虚拟地址空间:0~FFFFFFFF 中。
IO 端口是个物理地址,IO Space 是个物理地址空间。
深入一点来说:
IO 地址空间范围:0000 ~ FFFF 共16位的空间里,分两种类型映射:固定映射和可变映射。
固定映射,比如 70/71 这些地址是固定的。 可变映射通过对芯片组控制(如南桥)将设备映射在可变地址空间。
更进一步来说:
IO 地址既可映射到 IO Space,有些设备IO地址也可映射到 Memory space 中去。同样对(北桥,南桥)进行设置
象 in al,71h 这条指令地址送往 south bridge(南桥)解析,典型就是 cmos 的地址。
访问空.JPG (62.6 KB, 下载次数: 14)
下载附件
2008-10-24 13:33 上传
先有个概念,I/O端口是CPU对外部设备的抽象。
对一个CPU来说,所有它所管理(或访问)的资源无非包括:
1.寄存器组。粗糙的划分通常包括通用寄存器组(x86中就是你用的ex,bx等寄存器),特殊寄存器组(如标志寄存器,timer,interrupt等,当然这些设备你可以看作外部设备)
2.存储器。粗糙的划分通常包括程序存储器,数据存储器。
3.外部设备。比如打印机,PCI桥,USB等等。另外上面timer,interrupt等等有时也按外部设备处理。
把这些资源统统放在一个大的集合中,就构成了CPU所管理的资源集。CPu管理这些资源时需要为这个集合中每个元素分配一个标志来区分。这个标志就是地址。
编码地址由下面几个要素组成:
地址 = {资源类别,资源大小};
对CPU指令来说,
通常资源类别编码在指令码中(如i/o与存储器分开编码),也有编码在地址码中(如i/o与存储器统一编码/),,还有直接硬件区分(如哈佛结构的程序存储器与数据存储器分开)。比如x86的in,inp,outp指令,实际上指令码本身就编码有资源类别信息。
资源大小编码在地址码中。
有了这些知识,就好理解I/O端口与I/O空间了。
按照上面的模型,那么CPU所有资源都可以地址{资源类别,资源大小}来找到。这里I/O端口就对用的实际的物理设备,而I/O空间地址就是该物理设备对应的标志码及设备地址。可以这样说,I/O空间代表所有I/O设备集合,而I/O端口是该集合中的一个元素。
(当然有时直接称I/O端口就是外部设备地址)
以搂主的例子说明
outputb(70,index)指令
与
in al,address
这里本身outputb与in指令的指令码就编码了不同的资源类别。你要他们访问同一资源,怎么可能。当然不排除有地址重叠。就看你内部怎么地址分配的
[ 本帖最后由 fineamy 于 2008-10-24 13:46 编辑 ]
感谢大家的回答,有了部分概念了。我一直在这个问题上迷糊,因为我们我觉得对外设访问只要in,out指令就可以了,既然外设编址也和内存一样,16位地址线形成的io地址空间访问,只要用in al,dx(地址)就好了,可是像cmos只有两个端口,那就只有两个地址形成的寄存器,为什么我们可以访问128位字节,而且是叫送地址,读数据。128字节这样说来就不是io space里面的内容了?像pci设备也一样
PC机里CMOS的访问方式,与3、4楼说的不是一回事。
存放SETUP信息的是一个CMOS存储芯片,早期好像只有32个字节,后来逐渐增大,64、128、256、512等。它借用CPU的两个I/O端口进行访问。你在70口写入地址,就是从71口读出该地址处的内容,或将新的内容写入该单元。
至于一般计算机原理里的IO端口和IO Space,后者是指该CPU所有I/O地址的集合,前者或指CPU的I/O脚集合,或指某I/O外围电路的一路I/O。
对于CMOS,PCI,USB,硬盘,软盘,光驱,网卡,显卡等等诸如此类设备,设备内部本身就有比较大的需要访问的空间。但是从CPU看来,只有几个访问窗口来访问这些设备。这些窗口地址就是前面提到的那些设备识别地址了(代表了该外部设备)。至于设备内部的地址,对CPU来说,它并不关心,也跟它没关系!
以这里CMOS来说,内部访问的128字节是CMOS芯片自己管理的,跟CPU没关系。CPU管理CMOS靠它提供的访问窗口!
这个访问窗口在实现技术上就是间接寻址技术。
那么为什么要这么做呢,原因是CPU的访问空间有限,比如这里的I/O SPACE,仅仅只要16位,如果每个外部设备都把自己内部的空间开放给CPU,那么显然是不够的,而且也没必要。看看一个PCI设备就要占多少???硬盘空间多少??
随着外部设备的增多,CPU的I/O空间就越紧俏。这时用间接寻址来扩展其I/O空间。
[ 本帖最后由 fineamy 于 2008-10-24 21:23 编辑 ]
嗯,我对fineamy这个回答非常满意,让我的迷雾解开了,原来是间接寻址的问题。非常感谢!