免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7092 | 回复: 7
打印 上一主题 下一主题

IO端口和IO Space的关系 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-23 20:30 |只看该作者 |倒序浏览
有谁能帮忙具体解释下IO端口和IO Space的关系?访问CMOS的端口是70/71,它的IO Space空间是多少?为什么读cmos时要outputb(70,index),inputb(71),而不是直接将in al,address

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-10-23 22:04 |只看该作者
你试过用in,out汇编指令操作吗?结果如何呢?

论坛徽章:
0
3 [报告]
发表于 2008-10-23 23:48 |只看该作者
原帖由 dimple_yi 于 2008-10-23 20:30 发表
有谁能帮忙具体解释下IO端口和IO Space的关系?访问CMOS的端口是70/71,它的IO Space空间是多少?为什么读cmos时要outputb(70,index),inputb(71),而不是直接将in al,address


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 的地址。

论坛徽章:
0
4 [报告]
发表于 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 编辑 ]

评分

参与人数 1可用积分 +30 收起 理由
cjaizss + 30 我很赞同

查看全部评分

论坛徽章:
0
5 [报告]
发表于 2008-10-24 15:55 |只看该作者

回复 #4 fineamy 的帖子

感谢大家的回答,有了部分概念了。我一直在这个问题上迷糊,因为我们我觉得对外设访问只要in,out指令就可以了,既然外设编址也和内存一样,16位地址线形成的io地址空间访问,只要用in al,dx(地址)就好了,可是像cmos只有两个端口,那就只有两个地址形成的寄存器,为什么我们可以访问128位字节,而且是叫送地址,读数据。128字节这样说来就不是io space里面的内容了?像pci设备也一样

论坛徽章:
0
6 [报告]
发表于 2008-10-24 16:33 |只看该作者
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。

论坛徽章:
0
7 [报告]
发表于 2008-10-24 21:14 |只看该作者

不要混肴概念

感谢大家的回答,有了部分概念了。我一直在这个问题上迷糊,因为我们我觉得对外设访问只要in,out指令就可以了,既然外设编址也和内存一样,16位地址线形成的io地址空间访问,只要用in al,dx(地址)就好了,可是像cmos只有两个端口,那就只有两个地址形成的寄存器,为什么我们可以访问128位字节,而且是叫送地址,读数据。128字节这样说来就不是io space里面的内容了?像pci设备也一样

对于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 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-10-27 10:37 |只看该作者

回复 #7 fineamy 的帖子

嗯,我对fineamy这个回答非常满意,让我的迷雾解开了,原来是间接寻址的问题。非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP