什么是IO

CPU发出来的指令请求有memory和IO,对于memory请求,很容易理解,对应的有实际的线路,那么IO的话我就搞不明白到底是什么了。

为什么发出一个IO请求,就能知道某个device需要回应?为什么是这个device响应,不是那个device呢?

一个device如果有两个IO port,为什么是这个port而不是那个port?

port address到底是如何发挥作用的?

简单来说,IO就是另外一种资源,和memory类似的另外一种资源。它的实现方式有两种,一种是使用实际的IO地址,需要通过特别的IO指令才能访问到;另外一种则是memory map实现的IO,通过普通的memory操作就可以访问,例如X86中的MOV指令。如果使用的是IO地址,那么CPU需要有办法去区分当前是IO操作还是memory操作。一条IO指令和一条memory指令在CPU上反应出来的动作是不一样的,有一些CPU上就有专门的引脚来标注是否为IO,例如该引脚为高时表示IO,为低时表示memory;而没有专门引脚的CPU则需要有自己的处理方式。Sandy Bridge的CPU上并没有专门用于表明“是否IO”的引脚,无论是memory request还是IO request都是一样的交给CBo,CBo在进行SAD(source address decode)之后就能知道是否为IO request了,从而能够通过ring转交给适当的component(HA或者IIO等)。

谁来看这个引脚?应该是该CPU能访问到的所有device在接受到访问请求,进行decode时都需要检查这根引脚的状态。

在嵌入式平台中,大部分都是使用memory map方式来实现IO,因为这样CPU的结构更简单,指令集也更精简。另外,memory map IO还可以使用AND, OR, XOR这样的指令来直接操作IO,而不需要像dedicated IO中,需要遵循read,modify,write这样的顺序。

一个device到底拥有那些IO port呢?在现有的X86架构下,整个系统是通过PCIE总线连接在一起的。有一些是在chipset和CPU内部,有一些则是在外部。在PCIE的规范里面,定义了如何确定一个device所需要的资源:通过PCI Head里的BAR(base address register)可以知道。至于如何保证分配IO资源不产生冲突,则是BIOS的责任,它不能把一个IO地址分配给好几个device,只要能做到这点,IO访问时就不会出错。

归根到底,IO也就和memory一样,CPU发出一个地址,所有的device比较该地址是否属于自己,在比较的过程中,还需要比较类型(IO,memory),如果是,则响应。IO操作实际上是对寄存器进行操作,IO地址只是寄存器的地址而已。


参考资料

http://en.wikipedia.org/wiki/Input/output

http://en.wikipedia.org/wiki/Port-mapped_I/O

IA32 manual VOL1 chapter 14

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值