此图像提供了有关虚拟地址空间的完整图片。但它只说了故事的一半。它仅提供用户地址空间的完整图片,即...降低50%(或在某些情况下为75%)。
内核占用的剩余50%(或25%)怎么样?我知道内核也有很多不同的东西,如内核模块,设备驱动程序,核心内核本身。必须有某种布局吗?
它的布局是什么?如果你说它的操作系统依赖。我会说,有两个主要的操作系统Windows& Linux操作系统。请给出任何一个答案。
alt text http://img690.imageshack.us/img690/2543/virtualadressspace.gif
答案 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)