2010-08-31 99 views
1

众所周知,在32位Windows操作系统下运行的程序只有2GB的虚拟内存可用。另外也知道其他2GB被保留为内核空间。但是,内核空间实际上是什么?内核内存在Windows操作系统中包含什么?

我能理解内核本身需要的预留空间,但是为什么内核空间在VAS的过程中呢?谢谢。

+5

请为自己说说话。我们的64位用户有更多的地址空间供我们使用。 :) – cHao 2010-08-31 15:22:34

回答

9

获取Windows内部的书,它描述了血腥的细节。为简短摘要虽然,一些事情是在内核的虚拟地址(KVA)空间:

1)内核和HAL

2)的设备驱动程序

3)内核模式堆(所谓行政池,我总是觉得有趣)

4)通过手柄(进程,线程,事件,互斥等对象)

5)系统PTE,它映射所有出口到用户模式的对象种类有趣的东西远离gr ubby用户模式应用程序(例如执行堆栈的线程在内核模式下运行时)

6)文件系统缓存

使用这样的例子不胜枚举和...就像我说的,阅读Windows内部。

斯科特

+0

不要误解我的意思,但例如内核将位于进程VAS之外。设备驱动程序。也许你误解了我的问题。我明确表示2GB被保留用于引用作为内核的操作系统使用,但是在进程增值服务器内部。你列表中的很多东西都会被关闭。 – 2010-08-31 19:54:07

+1

@ b-gen-jack-o-neill:2GB实际上是内核自身内存的映射 - 包含本答案中提到的所有内容。它在每个过程中被相同地映射。 – caf 2010-09-01 01:18:18

+1

caf是正确的,那*是* 2GB是什么。我提到的所有内容都在2GB映射到每个进程中。 -scott – snoone 2010-09-01 12:06:02

1

计划写在高级语言,如C++,最终转换为OS API调用,具体的Windows API的Windows操作系统。许多Windows API,如CreateFile,实际上都是与内核模式驱动程序交谈的。进程地址空间中的内核空间用于为此进程分配内核资源。例如,驱动程序IOCTL调用包含在用户模式API和驱动程序之间传递的输入输出缓冲区。这些缓冲区分配在进程内核空间中。

通常,内核空间包含由内核模式组件代表此进程分配的资源。

+0

也非常好的答案。那么在内核地址空间中是否包含驱动程序正确指定并与应用程序通信所需的进程重要结构? – 2010-08-31 19:56:50

+0

@ b-gen - 你让自己过于复杂,其中一些评论没有帮助(我在删除了一大堆答案之后才决定编写这个答案)。只需获取Windows内部或任何驱动程序开发书并阅读它。如果有不明确的地方,请提出具体问题。它会更好地为您做好准备。 – snoone 2010-09-01 12:16:50

1

你的问题似乎是“为什么”而不是“标题中提到的”是什么。

此外,你的问题假设32位。 64位版本的Windows是完全不同的(例如,VAS是8TB,或者itanium系统上的7TB)。

至于“为什么”,你将如何传递来自内核函数(如驱动程序)的指针,这些指针并不包含在进程的VAS中?一本很好的书可以解决这个问题:Windows Internals.

+0

我喜欢你的答案。 OK,所以你说它部分例如通过CPU MMU中的换页来传递可变块,从而逃避进程地址空间?所以限制是为了防止解雇任何有效的流程页面? – 2010-08-31 19:55:39

2

在我看来,关于2GB边界还有一个鲜为人知的事实。许多应用程序通常使用大量指针运算(尤其是使用C,C++编写的应用程序...)。在这些应用程序中,向指针添加偏移量,甚至是减去指针是很常见的。

如果您的可用虚拟地址空间为2GB,则可以保证减去两个指针总是在-2147483647和+2147483648之间(这些是32位有符号值的限制)。

如果您的地址空间为3GB,则可能的差异将大于可以用32位有符号值表示的任何值。

如果你知道你的应用程序是安全的,而不是减去完全无关的指针(并且你的数组小于2GB!),你可以告诉Windows应用程序可以使用大于2GB的地址空间,方法是设置链接器标志LARGEADDRESSAWARE(或使用EDITBIN实用程序进行设置)。

对于XP(对Vista和W7不太确定),您可以启动到'内核空间'仅为1GB的模式,虚拟地址空间中的3GB留给应用程序。如果您的应用程序是LARGEADDRESSAWARE,则会获得完整的3GB。如果没有,你只能得到2GB。

在64位Windows上,LARGEADDRESSAWARE 32位应用程序甚至获得4GB,因为Windows在32位区域中不需要大量地址空间(毕竟它是64位操作系统)。

+0

在64位应用程序中,LARGEADDRESSAWARE标志默认设置。获取您的地址空间量取决于您的Windows版本和版本。 (在Win7 Pro中,最多可以有8TB,但系统中只能有192GB的实际内存 - 其余的必须是交换文件或映射文件。) – cHao 2010-08-31 16:55:50

3

内核内存映射到每个进程的虚拟地址空间的原因是,上下文切换到内核模式不需要更改进程页表。目前的特权级别仅提升到0,这立即使这些页面可访问。

仅当切换到不同的进程时才必须切换页表。由于这是一项昂贵的操作(例如它需要TLB刷新),所以将其频率降至最低是一个胜利。

此外,如果你确实切换到特殊的内核页表,你切换到内核空间,你必须选择一部分用户空间地址空间来替换。这会使得那些用户空间无法访问内核,这将需要反弹缓冲区或更多的地址空间,以避免将这些区域中的数据传输到内核或从内核传输数据。