X86架构的几种地址空间

1.CPU地址空间
CPU地址空间是指CPU所能寻址的空间大小,比如对于32位CPU来说,其所能寻址的空间大小为0~4G。这是由CPU自身的地址总线数目决定的。这段空间也被称作CPU物理地址空间。

2.内存地址空间
内存地址空间就是指内存控制器所能寻址的空间大小。在x86处理器系统中,内存地址空间是CPU地址空间的一部分。但是在32位x86系统中,并不是所有的内存地址空间都能被系统使用,如下图:
在这里插入图片描述

如图所示,左侧0~4G为CPU所能寻址的地址空间,红框内的空间是能被CPU识别的内存地址空间。右侧为内存控制器所能寻址的空间大小为4GB,但是只有一部分空间能被CPU所识别。这就是为什么4GB内存在32位x86系统只能被识别为3G多的原因,因为剩下的CPU地址空间被其他设备占用了,比如PCI设备、Local APIC或者IO APIC等,这些CPU地址空间对应的是这些设备的寄存器区域。

3.设备的内存映射空间
注意,这里的设备内存映射空间是指硬件机制上实现的设备寄存器访问方式映射,而不是指MMU中虚拟地址到物理地址的映射。在上图中,我们可以得知,CPU通过CPU地址空间中的内存地址空间能访问内存设备,大概的访问流程如下:
在这里插入图片描述
CPU发送相关信号给北桥,告知其要访问内存,然后北桥通过内存控制器来访问内存设备。在汇编指令级别,这是通过MOV指令实现的,比如MOV eax,[mem addr],就能触发北桥通过内存控制器访问内存。这是CPU访问内存设备的情况,那么CPU如果要访问别的设备呢,比如要访问PCI设备,这是如何实现的?
从第2小节的图中可以看出,在CPU地址空间中有一段空间叫做PCI Memory Range,这段空间也叫做PCI设备寄存器映射区。CPU通过访问这段空间,从而达到访问PCI设备的目的访问,意思就是CPU能通过像访问内存那样的方式来访问这些设备。注意,CPU访问CPU地址空间上的设备都是通过MOV指令来实现的。CPU访问PCI设备的大概流程如下:
在这里插入图片描述

CPU发送相关信号给北桥,告知其要访问PCI设备,然后北桥通过PCI控制器来访问PCI设备中的寄存器。

4.端口地址空间
端口地址访问是x86处理器系统中另外一种访问设备的方式,不同于CPU地址空间,端口地址空间只有64KB大小,为0~65535,这是因为访问端口时必须将端口地址放入dx寄存器,dx寄存器是16位的,故端口地址空间只有64KB大小。如下图:
在这里插入图片描述
端口其实就是设备中的寄存器,只不过访问这些寄存器并不是通过MOV指令来访问,而是通过IN/OUT指令来访问。比如在北桥中有一个端口,其地址为0xCF8,访问这个端口流程如下:
在这里插入图片描述
CPU发送相关信号给北桥,告知其要访问0xCF8端口,然后北桥发现这个端口是属于自己的,就直接访问。

5.x86处理器系统中设备驱动编写注意
在PPC和ARM处理器系统中,外设的寄存器都是被映射到CPU地址空间上的,所以访问这些外设寄存器通过readl、writel等系统接口就可以,因为readl、writel这些系统接口最终都会被翻译为MOV指令。但是在x86处理器系统中,还存在着通过端口地址空间访问设备的情况,如果一个设备的寄存器是通过端口地址来访问的,那么就需要用in8、out8等这些系统接口,因为这些系统接口最终会被翻译为IN/OUT指令。所以在为x86处理器系统下的设备编写驱动时,一定要搞清楚设备的寄存器是通过CPU地址空间来访问的还是通过端口地址来访问的。比如显卡设备,有的寄存器是通过CPU地址空间来访问的,有的寄存器是通过端口地址来访问的,这时候访问这些不同方式的寄存器就需要使用不同的系统接口。

最后感谢蛋哥的文章分项。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值