我有一些与Windows内核和用户模式进程相关的问题。
如果我有一个hello world应用程序和一个公开新系统调用foo()的hello world驱动程序,我想知道一旦进入内核模式,我能够做什么和不能做什么。
首先,当我编写我的新的hello world应用程序时,我会得到一个新的进程,这意味着我有自己的用户模式VM空间(让我们保持简单,32位windows)。因此我拥有2GB的“自己”的空间,可以随心所欲地探测和查看。然而,我受到我的进程的限制。我不能(还没有涉及共享内存)触及任何其他人的内存。
如果我编写这个hello world驱动程序,并从我的用户应用程序中调用它,那么我(驱动程序代码)现在处于内核模式下。
首先是澄清/问题: 我仍然处于与用户模式应用程序相同的进程中,对吗?PID是否仍然相同?
内存问题: 内存被呈现为VM提供给我的进程,即使我有1GB的RAM,我仍然可以访问4GB的内存(2GB用户/2GB内核-不考虑服务器上的开关或细节,只是一般假设)。作为用户进程,我不能窥视任何内核模式内存地址,但我可以在用户空间做任何想做的事情,对吗?
如果我从驱动程序代码中调用我的hello world驱动程序,我是否仍然具有相同的用户模式内存视图?但现在我也能访问内核模式中的任何内存?
这个内核模式内存是共享的(不像用户模式,它是我的进程副本)吗?也就是说,编写驱动程序更像是为单个进程编写多线程应用程序(除调度之外)?
下一个问题。作为驱动程序,我能否更改正在运行的进程。比如说,我知道另一个应用程序(比如一个用户模式的Web服务器),并加载该进程的VM,更改其指令指针、堆栈或甚至加载不同的代码到该进程中,然后切换回我的应用程序?(我不打算做任何恶意的事情,我只是好奇到底什么是内核模式)
还有,在内核模式下,我能否防止操作系统抢占我?我认为(在Windows中),你可以将你的IRQL级别设置为这样做,但我仍然不完全理解这一点,即使在阅读Solomons的书(Inside Windows...)之后。我会问另一个与IRQL/DPC直接相关的问题,但现在,我想知道内核驱动程序是否有能力将IRQL设置为高并接管系统。
如果我有一个hello world应用程序和一个公开新系统调用foo()的hello world驱动程序,我想知道一旦进入内核模式,我能够做什么和不能做什么。
首先,当我编写我的新的hello world应用程序时,我会得到一个新的进程,这意味着我有自己的用户模式VM空间(让我们保持简单,32位windows)。因此我拥有2GB的“自己”的空间,可以随心所欲地探测和查看。然而,我受到我的进程的限制。我不能(还没有涉及共享内存)触及任何其他人的内存。
如果我编写这个hello world驱动程序,并从我的用户应用程序中调用它,那么我(驱动程序代码)现在处于内核模式下。
首先是澄清/问题: 我仍然处于与用户模式应用程序相同的进程中,对吗?PID是否仍然相同?
内存问题: 内存被呈现为VM提供给我的进程,即使我有1GB的RAM,我仍然可以访问4GB的内存(2GB用户/2GB内核-不考虑服务器上的开关或细节,只是一般假设)。作为用户进程,我不能窥视任何内核模式内存地址,但我可以在用户空间做任何想做的事情,对吗?
如果我从驱动程序代码中调用我的hello world驱动程序,我是否仍然具有相同的用户模式内存视图?但现在我也能访问内核模式中的任何内存?
这个内核模式内存是共享的(不像用户模式,它是我的进程副本)吗?也就是说,编写驱动程序更像是为单个进程编写多线程应用程序(除调度之外)?
下一个问题。作为驱动程序,我能否更改正在运行的进程。比如说,我知道另一个应用程序(比如一个用户模式的Web服务器),并加载该进程的VM,更改其指令指针、堆栈或甚至加载不同的代码到该进程中,然后切换回我的应用程序?(我不打算做任何恶意的事情,我只是好奇到底什么是内核模式)
还有,在内核模式下,我能否防止操作系统抢占我?我认为(在Windows中),你可以将你的IRQL级别设置为这样做,但我仍然不完全理解这一点,即使在阅读Solomons的书(Inside Windows...)之后。我会问另一个与IRQL/DPC直接相关的问题,但现在,我想知道内核驱动程序是否有能力将IRQL设置为高并接管系统。