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

问题描述 投票:0回答:4

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

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

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

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

windows assembly linux-kernel driver kernel
4个回答
2
投票

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


1
投票

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

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


0
投票

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

通常使用32位可以处理4 GB内存(2 ^ 32 = 4294967296),因此拥有4 GB的地址空间(而不是2 GB)似乎是合乎逻辑的。原因如下:假设你有两个指针,就像在C / C ++中一样:

char *ptr1;
char *ptr2;

我现在想知道两个指针之间的区别,如下所示:

offset = ptr2 - ptr1;

“偏移”的数据类型应该是什么?如果我们不知道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空间。

希望这有点澄清。


© www.soinside.com 2019 - 2024. All rights reserved.