用户内核模式切换(Windows内核学习笔记)

2021年9月17日 33点热度 0条评论 来源: KookNut39

Inter x86将处理器执行模式分为4层环,我们平时说的用户层程序处于3环(Ring3),内核层代码处于0环(Ring0),而Ring3的地址空间是各进程之间独立的,Ring0层是进程之间共享,不同进程会由进程上下背景文的切换来实现对Ring0层访问。Windows中并没有使用Ring1和Ring2层。
我们的用户层进程通过系统服务来完成我们需要完成的工作,而系统服务是在内核层实现的,那么就需要CPU就要从Ring3层的调用切入Ring0层,那么这个过程是如何实现的?
进入内核一般有中断、异常、自陷三种手段,而如果是我们平时函数正常系统调用,会通过自陷指令(int 0x2e)让CPU主动进入系统空间,对于应用程序而言,相当于执行了一次函数调用。还有一种称为快速调用约定的sysenter和sysexit指令,也是调用系统服务,并为此配备了SYSENTER_CS_MSR、SYSENTER_EIP_MSR、SYSENTER_ESP_MSR三个MSR(Mode Specific Register)寄存器。
接下来说一说这二者分别是怎么进行执行的,首先来说传统的Windows系统调用自陷指令int 0x2e:
以经典的ReadFile函数(因为我看的书是拿这个函数举例的)来进行解释,我们调用一个WinAPI ReadFile函数,其位于kernel32.dll的导出函数中,在用户层这个函数内部调用的是ntdll下的Nt系列的函数NtReadFile,该函数就是一个Windows的系统调用,内核中也有与之同名的函数。众所周知,ntdll下有两个函数,一个叫做ZwReadFile,一个叫做NtReadFile,二者指向同一片地址:

    原文作者:KookNut39
    原文地址: https://blog.csdn.net/qq_42253797/article/details/104938885
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。