windows内核开发学习笔记三十六:内核概念之内核模式

         windows内核中的各个组件并非单纯的独立模块,相反地组件之间不可避免地包含着复杂的依赖关系,甚至存在着交叉调用。也就是说,在内核的学习上,各组件之间的概念和知识是相互关联纠缠的,很难按照一个清晰的层次和顺序把知识体系厘清,往往介绍这个概念时,会牵涉到另外的概念,甚至是没有接触到的概念。但是要是先介绍另外的概念时,往往又是牵涉到其他的概念甚至是原本要介绍的本节的概念,才能更好理解。解决这个困境方法,就是先放弃追求一次性理解,把有些未理解的概念,先放在一边,先把本节要介绍的主要内容掌握,等后面介绍到相关的概念时再去学习;另外的推荐的学习方法是:不要指望读过一次就想把整个知识全部掌握,而是要多次阅读,反复对照,前后对照,甚至是同时需要查阅其他书籍。全方位立体式的读书学习,才能全面理解和掌握知识的结构和实质。

        对于本节介绍的内核模式,其实在前面的windows内核开发学习笔记二十三:windows操作系统的基本架构和 windows内核开发学习笔记二十五:两种内核模式切换的安全检测 的两篇博文已经做了介绍,但是由于当时是介绍和学习架构方面的内容,不方便展开介绍,因此在本节内容,再进行展开介绍一下。

        在Intel x86架构的处理器上,段描述符有一个2位长度的特权等级标示(2位 二进制位,取值 00 01 10 11四个值),其中:0(00)表示最高特权级,3(11)表示最低特权级。windows只使用0和3两种特权级,0表示CPU处于内核模式(kernel mode)3表示用户模式(user mode)在任何时刻,处理器总是处于两种模式中的一个。下图中的环形象的描述了处理器的形态,关于其他的ring1和ring2两个状态,在用到时再介绍。

windows内核开发学习笔记三十六:内核概念之内核模式_第1张图片

        处理器许多指令只有在特权级0模式下才可以使用,主要包括I/O指令、操总内部寄存器(GDT、IDT、MSR等)指令。当用户处于用户模式时,是一种相对隔离的状态,执行的指令和访问内存都是受限的,一旦越过限制就会引发处理器异常,操作系统需要捕获这些异常,并决定是否继续进行执行等,操作系统有足够的能力来保护自己免受用户模式代码的影响。但在处理器处于内核模式时,不存在这种异常保护,任何一个未被捕捉的处理指令错误都会引起系统崩溃。

    在windows中,当处理器处于不同模式时,可以访问的内存地址空间也是不同的。在用户模式下,处理器只能访问当前进程的地址空间(用户地址空间);而在内核模式下,不仅可以访问当前进程的地址空间,还可以访问系统地址空间。内核模式下的代码和数据都是共享的,所有的进程一旦其指令流进入内核模式下,则系统地址空间中的代码和数据都是相同的。

        一个指令流(即线程)在执行时,有以下几种模式切换情况:

  • 用户模式代码触发了异常,则控制流进入了内核模式,内核中的异常处理函数可以决定该控制流是否继续执行。
  • 用户模式代码在执行时,被一个中断打断(软中断和硬中断),则控制流进入特权模式,等中断处理例程完成以后,它若调用iret/iretd指令,则控制流恢复到用户模式下。
  • 执行特殊的模式切换指令,如intel x86的sysenter指令,从用户模式到内核模式。但从内核模式切换到用户模式,简单的使用sysexit,iret/iretd这样的指令就可以了。

        由于系统空间是所有进程共享的,所以任何一个进程在执行内核模式代码时,实际上是使用操作系统的服务。在windows的体系结构中,内核模式向上有一个执行体API,尽管它并非文档化的API,但对于应用程序而言,这便是系统服务。windows将这些服务组织成一张服务描述表(SDT,Service Descriptor Table),供使用。

你可能感兴趣的:(系统内核,windows内核,操作系统,系统内核,windows内核,操作系统,驱动开发,C/C++)