CPU位宽与内存寻址能力没有关系!

来源:互联网 发布:文科恋曲知乎 编辑:程序博客网 时间:2024/06/10 03:03

最近面试时遇到一个问题,特意看看有多少人认为CPU的位宽意味着寻址能力,结果发现也有相当一部分人被误导!请注意:2^CPU位宽次方这种计算方法是明显错误的!

系统上也是,一早就有技术支持64G内存,只不过微软为钱,没在32位的桌面级电脑上允许那项功能!

先讲CPU寻址能力!

一般厂商标示多少位CPU是说CPU的运算位宽!

而CPU的位宽一般是以 min{ALU位宽、通用寄存器位宽、数据总线位宽}决定的!也就是说CPU由ALU、通用寄存器、数据总线三者之中最少的位宽决定!所以CPU位宽与其寻址能力并不是挂钩的!

就正如我上边提示过的16位CPU能上1M的内存(这是本人一个笔误,应该是写8086 CPU),1M刚好是20位,这就已经说明CPU位宽与寻址能力不挂钩!

因此某些媒体几年前曾经说过(最近由于与网友中山狐讨论开一些问题而讲起PAE而记起来的),而且在网络上也流传得比较广泛的一个理论:现时CPU都是32位,所以寻址能力是2^32=4G这种说法是明显的错误!

再有!有的媒体曾经说64位CPU最大的好处是支持更大的内存这也是一个典型的错误!在AMD K8时代引入64位后,AMD的U寻址位就达到物理寻址40多位,而INTEL在p4 6系列之后物理寻址寻址能力亦达到40位,这大概是1TB,而如果是64位寻址应该是16EB,所以,以CPU位宽衡量CPU寻址能力是一个典型的错误!

有一个细心的人兄还发现其实我这篇文章中貌似是突出了32位这个词而虚化了CPU这个词!的确,我就是按当年那些文章那种说法而提出这问题的,目的就是想看看多少人被人误导!结果在这贴中也看到比例也不在少数(虽然不占大部分,但是人数也不少!)

事实上CPU寻址能力因每种CPU设计不同而不同!就正如说32位的X86CPU,其实就在PentiumII是引入了36位的扩展PAE机制(Physical Address Extention)地址位来支持64G内存(源于当时服务器的问题),正常情况下也是用32位寻址,但通过设置相应的寄存器(没记错是cr4)的相应位激活PAE就可以支持64位寻址了!

所以,请记住:每个CPU的寻址能力是看其设计的!而单纯以CPU位宽来看待该CPU寻址能力(就是上边红色字的那种寻址能力为2的CPU位宽的次方的说法是错误的!

上边讲到PentiumII通过设置控制寄存器来实现36位寻址,而正常情况下就32位寻址,而且能与前面的架构兼容!

这样不得不惊叹那些硬件设计人员那聪明的脑代,在设计时就想好了可扩充性,在一早就预想到将来会是一个高速、大容量的时代,为当时的奔腾CPU引入了一系列的东西!首先是32位运算能力,另外是为CPU引入32位地址总线,而且还引入MMU(分页单元),使得CPU对物理内存进行段页式管理!这种方式对内存的管理相比于传统方式是更为安全、有效的!而这时,CPU是采用二级分布制:页目录(在线性地址中占10位)->页表(10位)->内存页表页(12位),之后,再在页表项入边才是相应的空间!这样CPU就访问2^10*2^10*2^12=4GB的内存了(嘿嘿,是否有点似曾相识 )!

但因为INTEL面临服务器方面内存容量问题,就开始想办法了,于是,设计师开始想办法,但由于前边那设计的基础,他们很快就想到了,加多一级页表项,并加入相应控制寄存器,对其进行访问控制!这样,就可以对前的架构进行兼容,又能够在特殊情况满足要求哦!这套机制到现时还在用哦,目前最新的X86 CPU(扣肉架构、K8的后代物理寻址大概都在40位左右,但要兼容32位系统,所以还在用这套机制!)。

讲完硬件,当然要讲软件了,系统上一般是如何实现PAE呢,当然对硬件方面那聪明的设计是依样画葫了,最基本的手段是利用二进制在高位上增加0对数的大小是没影响这种想法,在算法上就直接增加位数来页表级数并实现虚存管理(这个与虚拟缓存有关系,但不相同)!然后对利用嵌入汇编对相应寄存器进行判断,一但发现不可用就将相应页置0,嘿嘿,这招好使好用喔!就算64位寻址都通杀!这是最基本的,还有其它方面的一些处理!例如设置一些状态位之类的操作和开了PAE后那些页的数据长度上是有变化的!LINUX内核就采用这种方法的,微软的嘛因为非开源,不知道(即使你知道微软的API,那也仅仅是函数接口,内部实现不可能太清楚)。

再说说关于32位系统开了PAE性能会下降这个话题吧!个人结合看过的相关资料认为:如果是4G以下(包含4G),如果开PAE,内存性能是很有影响的,因为开了PAE,在系统上要加多几级页目录,这样增加了上下文切换,减低性能情况明显!相对地,因为分页单元和CPU是同速率运行,因此影响相对是极少极少的!内存2G比4G差最主要是因为在操作系统上的问题