windows系统调用

来源:互联网 发布:yum安装mysql5.7 编辑:程序博客网 时间:2024/05/16 18:32

windows内核情景笔记(-) 系统调用

1.通过中断向量0x2e进行系统调用

从用户空间通过自陷指令进入内核时,CPU自动将下列信息压入系统空间堆栈:

用户空间的堆栈位置,包括堆栈段寄存器SS和堆栈指针ESP的内容;

CPU中 标志寄存器 的内容;

用户空间的指令位置,包括代码段寄存器CS和指令指针EIP的内容。

系统空间堆栈的内容保存在“任务状态段”(TSS)的数据结构里。CPU自动根据TR的指引从TSS中获取当前进程的SS和ESP两个寄存器的值。

通过PUSH保存各寄存器的内容,使段寄存器FS指向KPCR,使寄存器ESI指向当前线程,即当前线程控制块 PCR 偏移某个值找到KPRCB结构,KPRCB中包含CurrentThread指针(KTHREAD或ETHREAD,前者是后者内部的第一成分)。

KTHREAD中,KTHREAD_PREVIOUS_MODE 记录本线程的“先前模式”,是指进入KiSystemService()这个函数前CPU处于何种状态(用户态或系统态)。

KTHREAD中有个指针ServiceTable指向本线程的系统调用表。(SSDT或SHADOW SSDT)

2.快速系统调用

当执行sysenter指令时,CPU进入系统态

把寄存器SYSENTER_CS_MST的内容复制到段寄存器CS中;

把寄存器SYSENTER_EIP_MSR的内容复制到寄存器EIP中;

把寄存器SYSENTER_CS_MSR的内容+8写主堆栈指针ESP中;

把寄存器SYSENTER_ESP_MSR的内容复制到堆栈指针ESP中。

用户空间的程序断点不需要保存,因为寻阳固定不变的,就是KiFastSystemCallRet()的入口,由内核初始化时PspLookupKernelUserEntryPoints()获取ntdll.dll中KiFastSystemCall()和KiFastSystemCallRet()这两个函数的入口,并保存在一个数据结构ShareUserData中。堆栈指针保存在寄存器EDX中。

MSR寄存器中的内容由系统初始化时调用函数KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context) 进行初始化。


当CPU执行sysexit指令时,回到用户态,并且:

把CS设置成(SYSENTER_CS_MSR的内容+16),就是KGDT_R3_CODE

把寄存器EDX内容复制到EIP。

把SS设置成(SYSENTER_CS_MSR的内容+24),实际上是KGDT_R3_DATA。

把寄存器ECX内容复制到ESP


全局(段)描述表(GDT),GDTR指向内在中的GDT(一个结构数组),每一个表项是一个64位的KGDTENTRY数据结构,里面描述了段的起点,大小,保护模式,访问权限等信息。大小为NUM_GDT(28).在32位保护模式下,段寄存的内容称为“选择项”,主体部分高13位用于GDT或LDT的下标,Bit2为LDT/GDT的选择位,0表示选择GDT,1表示选择LDT,最低两位为RPL运行权限,为0表示0环,系统态。

0 0
原创粉丝点击