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内核学习笔记)
最新推荐文章于 2021-06-28 11:44:28 发布
本文介绍了Windows中用户层到内核层的模式切换,包括通过int 0x2e自陷指令和sysenter/sysexit快速调用。详细讲解了自陷调用的参数传递、寄存器保护,以及sysenter指令如何提高执行效率,深入剖析了系统调用的过程。
摘要由CSDN通过智能技术生成