为什么32位系统上虚拟地址空间是4GB
如果你愿意放弃平坦内存模型(flat memory model)并使用选择器(selectors),那么你可以将16 位选择器值与32位偏移量组合为一个48位的指针值。从理论上来说,这将创建高达248个不同指针值,如果你允许每个指针值寻址不同的内存字节,则会产生
在一台32位系统上,虚拟地址空间为4GB,这个大小由系统上指针的可用数量决定。对于一块32位的处理器,一个32位值可以表达232个不同的数值,如果你将每一个数值都指向不同的内存地址,则你就得到了一个232个字节的地址空间,也就是4GB。
如果你愿意放弃平坦内存模型(flat memory model)并使用选择器(selectors),那么你可以将16 位选择器值与32位偏移量组合为一个48位的指针值。从理论上来说,这将创建高达248个不同指针值,如果你允许每个指针值寻址不同的内存字节,则会产生 256TB 的内存。虽说理论上可以达到如此巨大的内存空间,但是在奔腾级CPU上这个理论最大值无法支持。
一个原因是,段选择器中的低位会用来携带段选择器的类型信息。所以,结果就是,一个16位段选择器可以有65536个不同数值,但是其中只有8191个数值可以用来进行寻址用户模式数据,也就是说最大地址空间会降至32TB。使用selector:offset这种寻址模型对地址空间的真正限制是:每个选择器只描述了平面32位地址空间的一个子集。
所以,即使你能使用到所有的8191个段选择器,它们都只是对同一个底层32位地址空间的特定视图。(另外,我觉得不会有人希望回到使用段选择器来寻址吧? 那可是一段疯狂的时代。)
在64位的Windows系统上,2GB地址空间限制就没有了,用户模式虚拟地址空间可以达到8TB。8TB有多大?这样说吧:从现在开始,你每秒钟都从这8TB的虚拟地址空间中分配1MB的内存,也需要整整3个月才能分配完。
(但请注意,你可以在64位程序上设置/LARGEADDRESSAWARE:NO开关,来告诉操作系统强制程序运行在2GB边界以下。不过,我还不大清楚你为什么要这样做,因为这样你只能使用庞大的64位地址空间中的很小一部分,同时,指针还是一个64位的指针。这就好比,你有线电视付费了但是不看一样。)
有了到目前为止你所学到的知识,也许你可以回答下面这个问题:“我们的boot.ini文件中有一个/7GB开关。我们的技术顾问告诉我们,我们应该将其设置为比系统内存少1GB。因为我们的系统配备了8GB内存,所以8GB – 1GB = 7GB。顾问表示,设置此值允许应用程序分配超过 2GB的内存。我们希望微软对此分析发表评论。”
总结对于上面的问题,聪明如你,是一定有办法回答的。没错吧?
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。本文来自:《Why is the virtual address space 4GB anyway?》
最近我写了个东西正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。我想:你值得拥有。
在学习多线程中,说到32位进程有4GB虚地址空间,这个怎么理解呢?
32位进程,从理论上每个32位进程可以访问的地址空间是2的32次方(4GB),这个地址空间是由系统分配的虚拟地址空间。在真实访问中会将虚拟内存映射到物理内存,所以你的内存是够用的。虚拟内存技术是在硬盘上开辟的空间,理论上是硬盘可用空间,所以每个进程都可以由4GB的虚拟内存空间。
32位的cpu的寻址空间为什么是4GB
内存寻址取决于处理器的针脚数量32位的处理器32个针脚就能有2的32次方的寻址空间
32位的处理器有35个针脚的就有2的35次方的寻址空间
64位的64个针脚就有2的64次方的寻址空间
文章评论