如众所周知,在32位的Windows操作系统上运行的程序仅具有虚拟存储器的2GB可用。还已知的是,其他的2GB被保留作为内核空间。然而,究竟什么是在内核空间?

我能理解需要内核本身的储备,但在过程中的增值服务,为什么内核空间?感谢。

有帮助吗?

解决方案

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

1)的内核和HAL

2)的设备驱动程序

3)的内核模式堆(称为执行池,我总是觉得有趣)

4)通过把手出口到用户模式中的对象(进程,线程,事件,互斥等对象)

5)系统PTE,其中所有种有趣的事情映射来自肮脏用户模式应用远(例如,执行堆栈的线程在内核模式下运行时)使用

6)文件系统高速缓存

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

-Scott

其他提示

这内核存储器被映射到每一个进程的虚拟地址空间的原因是,使得上下文切换到内核模式不必改变工艺页表。当前特权级别仅提升到0,立即使这些网页进行访问。

在页表仅具有当不同的处理被切换到切换。由于这是一项昂贵的操作(例如,它需要一个TLB冲洗),最小化它的频率是一个双赢。

此外,如果你的没有的特殊的内核页表开关去你切换到内核空间,你必须挑选用户空间的地址空间来替代的一部分。这将使得那些用户空间addressess不可访问到内核,这将需要反弹缓冲或多个地址空间摆弄时在这些区域的数据是要传送到或者从内核。

在我看来,有知道关于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位操作系统)。

程序写在高级语言,如C ++,最终转换为OS的API调用,具体而言,Windows API的用于Windows操作系统。许多Windows API一样的CreateFile,实际上是与内核模式驱动程序的谈话。在进程的地址空间内核空间用于此过程分配内核资源。例如,驱动器IOCTL调用包含输入 - 输出缓冲器,用户模式API和驱动程序之间传递。这样的缓冲液被分配在处理内核空间。

通常,内核空间包含由内核模式组件代表该方法的分配的资源。

您的问题似乎是“为什么”而不是“是什么”的提出的称号。

另外,您的问题假定32位。窗的64位版本的是完全不同的(例如,VAS是8TB,或7TB在Itanium系统)。

至于“为什么”,你将如何从不包含在这个过程中的VAS内核函数(如司机)传递指针?一本好书,读来算出这个是 Windows内部。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top