我有一些与内核和用户模式下的 Windows 进程相关的问题。
如果我有一个 hello world 应用程序和一个公开新系统调用 foo() 的 hello world 驱动程序,我很好奇一旦处于内核模式,我能做什么和不能做什么。
对于初学者来说,当我编写新的 hello world 应用程序时,我会得到一个新进程,这意味着我有自己的用户模式 VM 空间(让我们保持简单,32 位窗口)。所以我有 2GB 的空间,我“拥有”,我可以戳看,直到我满意为止。然而,我受到我的流程的约束。我不能(暂时不要将共享内存带入其中)触及任何人的记忆。
如果我编写这个 hello world 驱动程序,并从我的用户应用程序调用它,我(驱动程序代码)现在处于内核模式。
首先澄清/问题:
我仍然处于与用户模式应用程序相同的过程中,对吗?仍然有相同的 PID 吗?
记忆问题:
内存以虚拟机的形式呈现给我的进程,也就是说,即使我有 1GB 的 RAM,我仍然可以访问 4GB 的内存(2GB 用户/2GB 内核 - 不介意服务器上开关的细节或细节,这里只是一个一般假设)。
作为用户进程,我无法查看任何内核模式内存地址,但我可以对用户空间做任何我想做的事,对吗?
如果我从驱动程序代码中调用我的 hello world 驱动程序,我是否仍然具有相同的用户模式内存视图?但现在我也可以在内核模式下访问任何内存?
这个内核模式内存是共享的(与用户模式不同,用户模式是我自己的进程副本)?也就是说,编写驱动程序更像是为操作系统(即操作系统)的单个进程编写线程应用程序(除了调度?)
下一个问题。作为一名司机,我可以改变我正在运行的进程吗?比如说,我知道另一个应用程序(例如,用户模式网络服务器),并为该进程加载虚拟机,更改其指令指针、堆栈,甚至将不同的代码加载到进程中,然后切换回我自己的应用程序? (我并不是想在这里做任何邪恶的事情,我只是好奇它是什么really意味着处于内核模式)?
另外,一旦进入内核模式,我可以防止操作系统抢占我吗?我认为(在 Windows 中)你可以设置 IRQL 级别来执行此操作,但即使在阅读了 Solomons 的书(Inside Windows...)之后,我也不完全理解这一点。我会问另一个与 IRQL/DPC 直接相关的问题,但是现在,我很想知道内核驱动程序是否有权将 IRQL 设置为高并接管系统。
更多内容即将推出,但这些问题的答案将会有所帮助。