Windows提供了API接口供程序使用,可以使用操作系统提供的功能。
大部分的API具体实现代码都在内核态R0层,用户态R3层的接口仅仅只有一小部分代码,用于调用内核态的代码。
在Windows 2000中通过中断指令int 2E进入内核态,EAX寄存器保存函数编号,用于在系统服务表中找到对应的函数。
int 2E会找到IDT表中索引为0x2E对应的函数,在windbg中可以使用!idt 2E指令查看分发系统服务函数的函数为nt!KiSystemService
通过中断调用系统服务,切换过程繁琐,CPU必须从内存中分别加载门描述符和段描述符才能得到KiSystemService()的地址,速度慢,还需要进行权限检查。
为了实现快速系统调用,奔腾Ⅱ处理器引入了Sysenter/SYSEXIT指令,AMD K7引入了SYSCALL/SYSRET指令。
在全局描述符中存放了建立四个断描述符。
供SYSENTER指令使用的MSR寄存器如下:
SYSENTER_CS_MSR MSR地址为174h 含义为:目标代码段的CS选择子 在windbg中使用 rdmsr 174
SYSENTER_ESP_MSR MSR地址为175h 含义为:目标ESP 在windbg中使用 rdmsr 175
SYSENTER_EIP_MSR MSR地址为176h 含义为:目标EIP 在windbg中使用 rdmsr 176 对应nt!KiFastCallEntry
下面是系统调用的指令分别对应入口函数及返回指令、函数
INT 2E 对应KiSystemService 返回指令 iret 返回时的内核函数 KiSystemCallExit
sysenter 对应KiFastCallEntry 返回指令 sysexit 返回时的内核函数 KiSystemCallExit2
syscall 对应KiFastCallEntry 返回指令 sysret 返回时的内核函数 KiSystemCallExit2
从内核态到用户态可以通过如下方式:
nt!KeUserModeCallback 这是通过传入一个索引值,然后在PEB中的kernelcallbacktable表中寻找对应函数,调用完成后通过CallBackReturn类似函数中的 int 2B指令返回内核。
标签:返回,函数,Windows,MSR,态到,指令,内核,对应 From: https://www.cnblogs.com/ps12345678/p/16830263.html