需要完整的虚拟地址空间图片

时间:2010-06-08 03:46:38

标签: windows assembly linux-kernel driver kernel

此图像提供了有关虚拟地址空间的完整图片。但它只说了故事的一半。它仅提供用户地址空间的完整图片,即...降低50%(或在某些情况下为75%)。

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

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

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

4 个答案:

答案 0 :(得分:2)

我有更糟糕的消息,还有一个功能是将操作系统显式随机化内核地址布局作为安全功能。默认情况下,这在最近的Windows,OpenBSD中是打开的,并且是Linux的一个选项。

答案 1 :(得分:1)

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

此外,我认为地址空间的实际情况可能会有很大差异,具体取决于操作系统版本和一些细微的变化。

答案 2 :(得分:0)

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

通常使用32位可以处理4 GB内存(2 ^ 32 = 4294967296),因此拥有4 GB的地址空间(而不是2 GB)似乎是合乎逻辑的。原因如下: 假设你有两个指针,就像在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的内存。显然,操作系统数据结构现在存储在64位地址空间的某个地方,超出了应用程序使用的4GB。

希望这有点澄清。

答案 3 :(得分:0)