IO端口和IO Space的关系

发布于 2022-09-22 12:51:35 字数 117 浏览 25 评论 0

有谁能帮忙具体解释下IO端口和IO Space的关系?访问CMOS的端口是70/71,它的IO Space空间是多少?为什么读cmos时要outputb(70,index),inputb(71),而不是直接将in al,address

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

失退 2022-09-29 12:51:35

你试过用in,out汇编指令操作吗?结果如何呢?

星星的軌跡 2022-09-29 12:51:35

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

伏妖词 2022-09-29 12:51:35

访问空.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 编辑 ]

貪欢 2022-09-29 12:51:35

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

栀子花开つ 2022-09-29 12:51:35

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。

分開簡單 2022-09-29 12:51:35

感谢大家的回答,有了部分概念了。我一直在这个问题上迷糊,因为我们我觉得对外设访问只要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 编辑 ]

梦在深巷 2022-09-29 12:51:35

嗯,我对fineamy这个回答非常满意,让我的迷雾解开了,原来是间接寻址的问题。非常感谢!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文