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