gpt4 book ai didi

kernel - 命令和程序如何与 Window OS 通信

转载 作者:行者123 更新时间:2023-12-02 05:09:22 26 4
gpt4 key购买 nike

为 Windows 编写的程序如何与 Windows NT 内核交互或向其发出命令?

内核如何返回任何数据?

最佳答案

为了回答这个问题,了解用户模式和内核模式之间的区别很重要。内核模式是最高特权的 CPU 模式,执行代码可以完全访问硬件。它用于最底层的操作系统功能。用户模式是一种更受限制的 CPU 模式。它可以防止代码直接访问硬件。应用程序在用户模式下运行。当然,他们仍然需要以某种方式访问​​硬件,因此他们需要调用内核。

这就是你的问题。为了允许用户模式代码调用内核,Windows 内核设置了一个入口点。在基于 x86 的系统上,此入口点是软件中断 (int 2e) 或 sysenter/syscall 指令。执行这些指令会导致 CPU 模式切换,将 CPU 从用户模式转换为内核模式。一旦 CPU 切换了模式,它就会调用内核指定的函数。在 Windows 中,此功能是系统服务调度程序。

系统服务调度器负责调用用户态代码想要的内核服务。它获取由用户模式代码指定的功能编号,并在系统服务描述符表 (SSDT) 中查找它。 SSDT 基本上是指向每个内核服务的函数指针列表。一旦它识别出正确的内核服务,它就会使用用户模式应用程序也指定的参数调用它。内核服务完成后,CPU 通过 iret 指令(如果来自软件中断)或 sysexit/sysret(如果来自 sysenter/syscall)返回应用程序。

所有这些听起来都相当复杂,而且确实如此,这就是 Windows 对程序员隐藏这些细节的原因。 Windows 没有要求他们通过内核设置的入口点直接与内核通信,而是为程序员提供了几个 DLL,这些 DLL 为他们执行此操作。

现在这里再次变得更加复杂。从用户态调用内核服务的过程是在ntdll.dll中实现的,但大多数程序员并不直接使用ntdll.dll。相反,它导出一组称为 Native API 的通用内核服务。在此之上,Win32 API 是在 kernel32.dll 中实现的。 kernel32.dll 中的大多数函数只是 ntdll.dll 中函数的包装器。

你可能会问为什么要这样做。为什么不直接让 kernel32.dll 调用内核函数呢?这样做的原因是允许不同的多用户模式 ​​API。 Windows NT 旨在支持多种 API,不仅是 Win32,还支持 POSIX 和 OS/2。每个用户态 API 都会调用 ntdll.dll 来实现自己的 API,从而避免它们需要自己直接调用内核服务。

关于kernel - 命令和程序如何与 Window OS 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7318337/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com