转:Intel CPU 地址空间总结

一、地址空间映射

这里要说的是Intel构架下的CPU地址空间布局,注意这里没有说是内存地址空间布局。

我们说的内存通常是指DRAM,DRAM相对于CPU也可以算是外部设备,CPU地址空间是CPU访问外部设备过程中的一个概念,CPU除了访问DRAM外还会访问许多其他的设备。可以粗略的认为CPU地址空间包含DRAM地址空间,但两者却是不同的概念。而且DRAM地址空间是由内存控制器直接访问的,由CPU间接访问的。

过去很长一段时间Intel CPU是32位的,也就是可以访问到4GB的地址空间,但是当时的DRAM通常也就是512MB到2GB之间,现在假设DRAM是1GB,那么就是3GB的地址空间是空的。在计算机里面,地址也是资源。这空的地址空间就用来访问外部设备IO所用,这部分被称为MMIO(Memory Mapped I/O)。MMIO的空间是很大的,它包含了PCI的配置空间(256MB或者更大),内置集成显存(256MB,或者更大),还有其他很多东西 。所以这部分的大小是不容忽视的。

现在的Intel CPU一般都是64位的,也就是可以访问到64GB。而DRAM也是越来越大,以至于DRAM加上MMIO的空间超出了4GB,而MMIO的空间是不能随意变更的。所以现在的做法就是将DRAM的一部分重映射到4GB以上的空间,下面就以DRAM有5GB为情况,做一个例子。请看下图

上图中左边是地址空间,右边是DRAM空间,其中红色的字体表示寄存器,可以在spec中找到该寄存器的说明,这几个寄存器决定了整个地址空间的大的格局。这里就简要说明一下。

TOLUD,指向32位地址,也就是4GB以内。它是一个分界线,在0-TOLUD之间为DRAM,TOLUD-4GB之间为MMIO空间。该值由BIOS指定。为了方便说明,假设TOLUD被指定为2GB。

TOM,目前还不明确,我猜想应该是指实际物理内存的大小,“the total amount of populated physical memory”,比如上图TOM为5GB。可在本机的BDFR(0,0,0,A0)验证。

REMAPBASE和REMAPLIMIT,也是36位,分别表示基址和上限地址。用于重映射DRAM中被MMIO遮住的一部分空间,有2GB。该图中将DRAM中遮住的部分重映射到TOM的上方,所以REMAPBASE为5GB,REMAPLIMIT为7GB-1。

TOUUD,36位地址,大小为REMAPLIMIT+1的位置,比如上图TOUUD应该在7GB的位置,可以和TOLUD做对比理解,TOLUD是4GB以内DRAM与MMIO的分界线,TOUUD可以理解为4GB-64GB之间DRAM与MMIO的分界线。

以上是假设DRAM超出4GB的情况,假如DRAM只有3GB,而TOLUD指定为2GB呢?也就是2GB-3GB的DRAM被遮住。这时也是通过REMAPBASE和REMAPLIMIT将之重定向到4GB的上方。再假设DRAM只有2GB,TOLUD为2GB呢?这时就不存在重映射。 REMAPLIMIT小于REMAPBASE时(通常REMAPLIMIT为0),表示不使用重映射。

关于4GB以上的空间是如何访问的,请查看该网页说明:

http://en.wikipedia.org/wiki/Physical_Address_Extension

二、地址空间布局

这里着重说明4GB以下的地址空间的布局情况。下面是我用visio画的布局图,其实也就是将spec里说明的布局情况全部综合到一张图上,这也是前段时间总结出来的核心部分。

同样的图中红色字体部分为寄存器,这些寄存器与地址空间布局有着密切的关系。这些寄存器的详细说明可以参考spec。比如说“Egress Port Registers”这个4KB的窗口,会根据EPBAR的设置被放置到MMIO的任意一个DMI Interface的位置,但让该窗口不能与其他任何窗口重叠。

另外我也将我所了解的情况说明一下。

1.先看TOLUD-4GB的位置,可以看到有几处都是DMI Interface(Subtractive Decode)。DMI是南桥与北桥的接口,访问DMI,也就是访问南桥。

另外要解释的是Substactive decode,在计算机中地址译码有三种形式,当主设备通过指定地址访问总线上的从设备,一个是Positive decode,有从设备解码后发现是访问自己的,于是它就会响应,否则就没有从设备响应;一个是Negative decode,从设备收到该地址经解码后发现不属于自己的地址范围,从设备就转发出去;一个是Subtractive decode,在4个时钟周期内没有从设备响应,该地址就会发送到扩展的总线上面解码。

            

引自:http://www.microsoft.com/whdc/system/bus/pci/default.mspx

DMI Interface(Subtractive Decode)的意思就是CPU发送一地址先到北桥上解码,如果该地址没有北桥上的设备占用,那么就用该地址就会被传送到南桥上解码,,也就是访问南桥上的设备。可以假想为一开始4GB空间都是DMI Interface(Subtractive Decode),然后0-TOLUD被DRAM声明占用,TOLUD-4GB也纷纷被各种设备占用,于是就剩下了支离破碎的几个DMI Interface。(目前看上去这样理解是通顺的,但我希望它也是正确的)。

2.再来说明一下High BIOS。BIOS固件地址分三段,这里的High BIOS,后面的System BIOS,还有后面的Extended System BIOS。spec中已经说明,计算机启动后一开始执行的指令就在High BIOS中。然而High BIOS在4GB的位置,计算机reset后进入的是实模式。Intel构架下一开始段地址隐藏的高位部分全部为1,所以尽管第一条指令的逻辑地址是F000:FFF0,但访问的物理地址是FFFF_FFF0,这个地址比4G少16字节,因此,BIOS一般在此处只放置一条跳转指令,远跳转或近跳转,在EFI BIOS中,正是通过一条近跳转让BIOS不用进入实模式,直接建立描述符表,最终进入Flat Mode(属于保护模式)。关键的地方在于地址空间中640KB-1MB(PAM0-PAM6)之间是可编程的,可以指定为只读、只写、读写、禁用,这些都是针对DRAM的。开机之后这段空间是被禁用的,而DRAM是北桥的设备,禁用DRAM,那么这段地址空间就是发送到南桥去解码(对照上面关于DMI Interface的说明来解释),结果就解码到了High BIOS对应的固件上面。所以终究还是在High BIOS中执行指令。

可以用RW验证将PAM0(PCI 0/0/0 90H)的bit[5:4]设置为00,那么就发现, 0F0000-0FFFFF之间的数据与FFFF_0000-FFFF_FFFF之间的数据竟然是一样的。也证明在DRAM禁用的情况下,两部分地址是被解码到同一个地方的。

假如PAM0被设为只读或者读写,则读取的是DRAM上的信息,数据内容是System Bios。为什么System Bios明明在固件中却跑到DRAM中来呢?shadow的时候,只是北桥在负责地址decode,把这段地址指向了rom而不是把rom里面的数据copy到了DRAM里面。这是概念上的问题。实际上,BIOS在做的时候一般都是先把rom里面的数据copy到低端内存,(0~640K)中的某一个或者两个段里面,然后再解压缩出来的数据分别放到对应的segment里面去。比如E000,F000等。然后再把整个map关掉。让地址decode的时候对应的是实际的DRAM而不是ROM了。

3.接着说一下PCI配置空间。可以看到它的基址是由PCIEXBAR决定的,用RW软件验证PCI数据可以用Memory的方式看到。各个PCI的地址空间可以用这个式子计算:PCI Express Base Address + Bus Number x 1 MB +Device Number x 32 kB + Function Number x4 kB。打一个比方,我的电脑的PCIEXBAR中看到基址为F400_0000,当我要访问bus(0)device(1F)function(3)时,通过计算可以得到地址为F40F_B000,于是从PCI 0/1F/3中看到的数据与从Memory的F40F_B000位置看到的数据是一样的。注意查看的时候要将PCIEXBAR的bit0置1。

PCIEXBAR—PCI Express Register Range Base Address
B/D/F/Type: 0/0/0/PCI
Address Offset: 60-67h
Default Value: 00000000E0000000h
Access: RO, R/W/L, R/W/L/K
Size: 64 bits

4.要说明的大概就这些,其他的各种地址窗口的作用、地址空间的位置,都可以在spec中很轻易地找到。而且图中也标注了各个区间有关的寄存器。

原文链接:

http://www.biosren.com/viewthread.php?tid=3200&extra=&ordertype=1&page=1

时间: 2024-10-11 12:25:36

转:Intel CPU 地址空间总结的相关文章

Intel CPU 概览——从8086到四代酷睿i7

现在Intel已然成了CPU的代名词,但当年的Intel并没有现在这么风光.从1978年发布的8086到2013年的四代i7,整整35年,她见证了从PC到互联网.移动互联网的几次巨变:这些年的变化实在太多.本文不打算对这段历史及引领这段历史的风云人物做多少描述和评价(这些内容足够写好几本书的了),你若对这些内容更感兴趣,请移步.本文只对Intel CPU家族中几位名声显赫的人物做简要介绍,并对比他们区别. 简要历史 接下来,对Intel的几个划时代的CPU产品做简要介绍. Intel ? 808

Intel CPU 发展简史

Intel CPU 发展简史 1971年11月15日:4004 1971年11月15日,Intel公司的工程师霍夫发明了世界上第一个商用微处理器-4004.这款4位微处理器集成了2250个晶体管,晶体管之间的距离是10微米,能够处理4bit的数据,每秒运算6万次,频率为108KHz,前端总线为0.74MHz (4bit).原为日本Busicom公司的计数器开发. 编号为4004,第一个"4"代表此芯片是客户订购的产品编号,后一个"4"代表此芯片是英特尔公司制作的第四

亲历Intel CPU漏洞的正面袭击

作为已经3年多没有写过代码的程序员来说,本篇不应该算是一篇技术型的文章,而是作为服务上千家客户的ToB大数据创业公司的一次经历,可能很多人对于我们的产品了解并不多,所以我先简单介绍下我们的技术和业务应用场景,我们有多个SaaS产品,有给游戏公司提供免费使用的游戏数据分析平台,有专门做效果广告监测的Ad Tracking系统,以及把移动广告监测和多维用户行为分析数据打通的TrackingIO系统,其中系统架构较为复杂的是TrackingIO,同时使用TrackingIO的客户也较多,每天的数据点数

Intel CPU 漏洞分析

Intel CPU漏洞分析报告 预备知识 存储分级 由于计算机存储分级的特性(第一级:寄存器,第二级:高速缓存,第三级:内存,第四级:磁盘),每一级之间的访问速度差距高达数量级.所以处理器会将用到的数据和指令加载进高速缓存(现代CPU分指令高速缓存与数据高速缓存),以提高计算机的执行速度.其加载数据或指令进高速缓存的原则是(空间局部性.时间局部性): 1. 时间局部性:如果一个数据被访问,那么在近期它很可能还会被再次访问. 2. 空间局部性: 与当前访问的数据紧挨着的数据,近期将会被访问 分支预

Intel CPU命名规则

intel的几代CPU中,后缀字母主要有以下几种:M:笔记本专用CPU,一般为双核,M前面一位数字是0,意味着是标准电压处理器,如果是7,则是低电压处理器.U:笔记本专用低电压CPU,一般为双核,U前面一位数字为8,则是28W功耗的低压处理器(标准电压双核处理器功耗为35W),若前一位数字为7,则是17W功耗的低压处理器,若为0,则是15W功耗的低压处理器.QM(第四代开始改为MQ):笔记本专用CPU,“Q”是“Quad”的缩写,即四核CPU.若QM前一位数字是0,则表示此产品为功耗45W的标准

Intel CPU主流接口与图示

在组装PC或更换CPU主板时,最应该注意的就是CPU接口是否能和主板匹配.CPU采用的接口方式有引脚式.卡式.触电式.针脚式等.不同CPU接口类型,在插口数量.体积.形状上有所差别,不能互插. Intel ,LGA(Land Grid Array)代表着Intel64位平台封装方式,数字代表着针脚数.在LGA系列出现前,Intel与AMD处理器插座都叫SocketXXX,Socket代表插座,数字代表针脚数. LGA2011 LGA2011,又称Socket R,是英特尔(Intel)Sandy

关于intel cpu命名规则的一些说明

1?? 关于Gen标识符的详细内容.  代与代之间主要是架构,制作工艺(即x nm),针脚和功耗等的区别. 第一代是Westmere架构,32nm: 第二代是SandyBridge架构,32nm: 第三代是IvyBridge架构也属于SandyBridge架构,22nm: 第四代是Haswell架构,22nm: 第五代是Broadwell架构,14nm: 第六代是Skylake架构,14nm: 第七代是Kaby Lake架构,14nm. 2??关于产品线后缀的详细说明. 尾缀Y:代表超低电压,功

《Intel汇编第5版》 Intel CPU小端序

一.MASM汇编器中的数据类型 二.Intel汇编中的立即数类型 三.定义有符号和无符号整数 四.小端序 内存中数据按照字节存储,一个4个字节无符号整数,其高位存储在低地址上,低位存储在高地址上. 比如0x12345678这个整数,在内存中按照内存地址从小往大排列是:0X78 0x56 0x34 0x12 五.汇编代码验证 INCLUDE Irvine32.inc includelib Irvine32.lib includelib kernel32.lib includelib user32.

Intel CPU屏蔽PCIE错误的两种方法

HasWell CPU PCIE Error 屏蔽的两种办法 在做PCIE卡设备热插拔,或者需要强行断掉PCIE卡的供电且不导致系统重启的情况下,HaswellCPU提供了多种方式. 方式一是利用PCIE的PCIE 和AER capability的相关位,屏蔽这些位可以防止上述操作导致系统重启:清除这些位后并打开屏蔽位后,就可以继续向CPU传递PCI的各种错误.下面分别讲述如何屏幕和打开错误使能位然后执行相应PCIE卡槽的操作. 1.      Disable AER: I.