网站首页 >> 值得一看 >> 正文
标题

虚拟地址空间怎么算(为什么32位系统上虚拟地址空间是4GB)

墨雨婷   04月10日 17:49   0
内容

在一台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)
点评

本文暂无评论 - 欢迎您