2010-06-08 63 views
0

该图像提供了一个关于虚拟地址空间的好照片。但它只说了一半的故事。它只给出用户地址空间的完整图片,即...降低50%(或在某些情况下降低75%)。需要完整的虚拟地址空间图片

剩下的50%(或25%)是由内核占用的。我知道内核也有很多不同的东西,比如内核模块,设备驱动程序,核心内核本身。必须有某种布局是正确的?

它的布局是什么?如果你说它的操作系统依赖。我会说,Linux有两个主要的操作系统Windows &。请给出任何一个答案。

alt text http://img690.imageshack.us/img690/2543/virtualadressspace.gif

+2

我要告诉你一个坏消息拍摄照片。你想要的东西不能提供。它不仅取决于操作系统,还取决于正在使用的操作系统版本。此外,您的用户地址空间图也不完整,取决于您使用的编译器以及它的版本。 – 2010-06-08 04:04:21

+1

只有两个主要的操作系统? – 2010-06-08 04:12:23

+0

@JUST我正确的意见:'另外,你的用户地址空间图也是不完整的':怎么回事?我一直认为这是完整的。 &这怎么依赖于编译器?我认为这只取决于操作系统。 – claws 2010-06-08 06:00:39

回答

2

我有你更坏的消息,这里还有由操作系统的安全功能明确随机内核地址布局的特征。这在大多数最近的Windows和OpenBSD中都是默认的,也是Linux的一个选项。

1

就像用户在这里说的,你的照片不完整。它倾向于看起来特定于单线程操作系统。特别是在这个过程中可能有数百个线程(因此 - 共享相同的地址空间),每个人都有自己的堆栈。

此外,我相信地址空间的实际图片可能会有很大的不同,取决于操作系统版本和一些细微的变化。

0

从您的问题或图像中不完全清楚,但使用“系统地址空间”可能意味着2GB-4GB之间的区域。这确实占据了理论上4GB空间的一半,但有一个合理的理由。

通常使用32位,您可以寻址4 GB的内存(2^32 = 4294967296),因此拥有4 GB的地址空间似乎是合乎逻辑的,而不是2 GB。这样做的原因是: 假设你有2个三分球,这样在C/C++:

char *ptr1; 
char *ptr2; 

我现在想知道有什么区别的两个指针之间,就像这样:

offset = ptr2 - ptr1; 

'offset'的数据类型应该是什么? 如果我们不知道ptr1是否在ptr2之前,反之亦然,偏移量可以是正数也可以是负数。现在,如果ptr1或ptr2的范围在0 - 2GB之间,那么偏移总是在-2147483648和+2147483647之间,这完全符合4字节有符号整数。

但是,如果ptr1和ptr2能够访问完整的4 GB地址空间,则偏移量将介于-4294967296和+4294967295之间,不再适合4字节有符号整数。

如果您确定自己从未在应用程序中进行过这种计算,或者您确定如果您减去2个指针,它们将永远不会超过2 GB(或者您的向量总是小于2 GB),你可以告诉链接器(Windows,Visual Studio)你的应用程序是LARGEADDRESSAWARE。此链接器标志在可执行文件中设置了一些位,如果32位Windows正确引导(在XP上必须使用/ 3GB引导),则Windows为您提供了3GB而不是2GB(仅用于LARGEADDRESSAWARE可执行文件)。 其余1GB仍用于操作系统数据结构(但我没有关于它们的详细信息)。

如果您运行的是64位Windows,那么情况会变得更加有趣,因为LARGEADDRESSAWARE可执行文件将获得4GB的内存。显然,操作系统数据结构现在存储在应用程序使用的4GB以外的64位地址空间的某处。

希望澄清一下。