我正在尝试从内核中挂起SYSENTER
调度函数,在过去的几天中,我正在研究程序执行SYSENTER
并想进入内核然后意识到{ {1}}和IA32_SYSENTER_EIP
负责在IA32_SYSENTER_ESP
之后设置内核RIP
和RSP
。
昨天我阅读了有关SYSENTER
的英特尔软件开发人员手册:
SWAPGS将当前GS基址寄存器值与MSR地址C0000102H(IA32_KERNEL_GS_BASE)中包含的值交换。 SWAPGS指令是供系统软件使用的特权指令。
使用SYSCALL实施系统调用时,没有内核堆栈 在操作系统入口点。也没有直接的方法来 获取指向内核结构的指针,内核堆栈从该结构中获取 指针可以被读取。因此,内核无法保存通用目标 寄存器或参考存储器。
从第二段开始,SWAPGS
似乎是OS内核执行there is no kernel stack at the OS entry point
来设置SWAPGS
,然后获取内核堆栈指针,但正如我所读的,在GS
中内核RIP(EIP)和RSP(ESP)应该从SYSENTER
和IA32_SYSENTER_EIP
设置,以便内核将其堆栈指针放在IA32_SYSENTER_ESP
中!
我的问题:
IA32_SYSENTER_ESP
的目的是什么?IA32_SYSENTER_ESP
和AMD LSTAR (0xC0000082)
之间有什么区别?我之所以这样问,是因为我看到Windows在我的Intel处理器上设置了0xc0000082。