PCI简介(二)

news/2024/7/3 4:50:35

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.x86处理器系统地址空间简介

1.1 CPU地址空间

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

1.2 内存地址空间

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

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

1.3 设备的内存映射空间

    这里的设备内存映射空间是指硬件机制上实现的设备寄存器访问方式映射,而不是指MMU中虚拟地址到物理地址的映射。CPU通过CPU地址空间中的内存地址空间能访问内存设备,大概的访问流程如下图所示:

    CPU发送相关信号给北桥,告知其要访问内存,然后北桥通过内存控制器来访问内存设备。在汇编指令级别,这是通过MOV指令实现的,比如MOV eax,[mem addr],就能触发北桥通过内存控制器访问内存。

    在CPU地址空间中有一段空间叫做PCI Memory Range,这段空间也叫做PCI设备寄存器映射区。CPU通过访问这段空间,从而达到访问PCI设备的目的。由于这种方式同样是通过MOV指令实现的,故这种方式被称为内存映射访问,意思就是CPU能通过像访问内存那样的方式来访问这些设备。注意,CPU访问CPU地址空间上的设备都是通过MOV指令来实现的。CPU访问PCI设备的大概流程如下图所示:

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

1.4 端口地址空间

    端口地址访问是x86处理器系统中另外一种访问设备的方式,不同于CPU地址空间,端口地址空间只有64KB大小,为0~65535,这是因为访问端口时必须将端口地址放入dx寄存器,dx寄存器是16位的,故端口地址空间只有64KB大小。如下图所示:

    端口其实就是设备中的寄存器,只不过访问这些寄存器并不是通过MOV指令来访问,而是通过IN/OUT指令来访问。比如在北桥中有一个端口,其地址为0xCF8,访问这个端口流程如下图所示:

    CPU发送相关信号给北桥,告知其要访问0xCF8端口,北桥发现这个端口属于自己,直接访问。

转载于:https://my.oschina.net/u/3399876/blog/1832612


http://www.niftyadmin.cn/n/4388304.html

相关文章

数组总结,持续更新~

数组的基础方法,就不一一介绍了,这里会介绍一些常用的ES6的一些常用方法, 在这之前,先说一些数组的常见问题。 1 数组的构建 数组的普通调用,等于构造调用。 下面的3种方式,都是一样的。 let arr Array(1,…

小程序中form 表单提交和取值方法

我们直接给 input 添加 bindinput,比如:<input bindinput="onUsernameInput" />,可以在 onUsernameInput 中直接使用 e.detail.value,即: onUsernameInput : function(e) { e.detail.value; } 但是,如果有多个输入控件,我们不可能为每个控件添加 bind…

java dateformat 24_java – (简单)DateFormat,允许24:00:00和00:00:00作为输入

值24:00未在LocalTime中表示,因为它严格地是第二天的一部分.考虑到24:00可以表示为LocalTime的一部分的模型,但结论是它在很多用例中会非常混乱,并且会产生比它解决的更多错误.但是在java.time中支持24:00.完全可以使用标准格式化技术对其进行解析,但是必须使用SMART或LENIENT模…

python使用yaml库读取和写入数据

import yamltest.yml文件数据&#xff1a;yaml_path r"D:\PycharmProjects\2020study\BBBstudy\test.yml" with open(yaml_path, r) as f:cfg f.read()print(cfg)# 此时读出来的数据是字符串print(type(cfg))# 用yaml.load方法转字典d yaml.load(cfg)print(d)prin…

lambda函数复习

def test(x):return x*x # 这里我们用lambda定义一个匿名的内联函数。请注意&#xff0c;该函数没有名称。test 是保存创建的lambda函数的变量的名称 # 上面的函数和下面的lambda函数是一样的 test_f lambda x: x*x print(test(3)) print(test_f(3)) # 常量函数 def constant(…

java serializable用法_java基础----gt;Serializable的使用

Serializable序列化的简要说明一、 持久化的简单介绍&#xff1a;“持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间。通过序列化一个对象&#xff0c;将其写入磁盘&#xff0c;以后在程序再次调用时重新恢复那个对象&…

html5-4 HTML5超链接、URL地址和表格

html5-4 HTML5超链接、URL地址和表格 一、总结 一句话总结&#xff1a; 1、cellspace有什么用&#xff1f; 清除表格的单元格间距 26 <table border1px cellspacing0px width100%> 2、页面中的字体一般用什么好&#xff0c;怎么设置&#xff1f; 微软雅黑&#xff0c…

两行代码激活windows系统

slmgr /skms kms.03k.org slmgr /ato 将以上代码存为bat文件运行