代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

Windows操作系统的内核内存包含什么?

  •  1
  • B.Gen.Jack.O.Neill  · 技术社区  · 14 年前

    我可以理解内核本身所需要的保留空间,但为什么在进程的VAS中需要内核空间呢?谢谢。

    5 回复  |  直到 14 年前
        1
  •  9
  •   snoone    14 年前

    获取Windows内部构件手册,它详细地描述了这一点。对于简短的总结,内核虚拟地址(KVA)空间中的一些内容:

    1) 内核和HAL

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

    4) 通过句柄导出到用户模式的对象(进程、线程、事件、互斥对象等)

    5) 系统PTE,它将各种有趣的东西从肮脏的用户模式应用程序中映射出来(例如线程在内核模式下运行时使用的执行堆栈)

    6) 文件系统缓存

    清单上还有很多…就像我说的,阅读Windows的内部结构。

    -斯科特

        2
  •  3
  •   caf    14 年前

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

    另外,如果你 如果切换到内核空间,就必须选择一部分用户空间地址空间来替换。这将使内核无法访问这些用户空间地址,这就需要跳出缓冲区或更多的地址空间来处理这些区域中的数据何时被传输到内核或从内核传输出去。

        3
  •  2
  •   Patrick    14 年前

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

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

    使用XP(不太清楚Vista和W7),您可以引导到一种模式,其中“内核空间”只有1GB,虚拟地址空间中的3GB留给应用程序。如果您的应用程序是LARGEADDRESSAWARE,您将获得完整的3GB。如果没有,你只能得到2GB。

        4
  •  1
  •   Alex F    14 年前

    用高级语言编写的程序,如C++,最终被翻译成OS API调用,具体地说,是Windows操作系统的Windows API。许多windowsapi,比如CreateFile,实际上是与内核模式驱动程序进行对话的。进程地址空间中的内核空间用于为此进程分配内核资源。例如,驱动程序IOCTL调用包含在用户模式API和驱动程序之间传递的输入输出缓冲区。这样的缓冲区是在进程内核空间中分配的。

        5
  •  1
  •   Philip Rieck    14 年前

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

    至于“为什么”,您将如何从内核函数(如驱动程序)传递进程的VAS中不包含的指针?读一本好的书来解决这个问题 Windows Internals.