我正在尝试SYSENTER
从内核中挂钩调度功能,在过去的几天里,我正在研究程序执行SYSENTER
并想要进入内核时会发生什么,然后我意识到IA32_SYSENTER_EIP
并IA32_SYSENTER_ESP
负责设置内核RIP
和RSP
之后SYSENTER
。
昨天我阅读了英特尔软件开发人员手册SWAPGS
:
SWAPGS 将当前 GS 基址寄存器值与 MSR 地址 C0000102H (IA32_KERNEL_GS_BASE) 中包含的值交换。SWAPGS 指令是供系统软件使用的特权指令。
当使用 SYSCALL 实现系统调用时,在 OS 入口点没有内核栈。也没有一种直接的方法来获取指向内核结构的指针,从中可以读取内核堆栈指针。因此,内核无法保存通用寄存器或参考内存。
从第二段开始,there is no kernel stack at the OS entry point
似乎操作系统内核执行SWAPGS
设置GS
然后获取内核堆栈指针,但正如我所读到的,SYSENTER
内核中的 RIP(EIP) 和 RSP (ESP) 应该设置从IA32_SYSENTER_EIP
,IA32_SYSENTER_ESP
因此内核的堆栈指针在IA32_SYSENTER_ESP
!
我的问题:
- 如果内核堆栈地址应该来自GS,那么目的是
IA32_SYSENTER_ESP
什么? AMD LSTAR (0xC0000082)
和 和有什么区别IA32_SYSENTER_EIP
?我问它是因为我看到 Windows 在我的英特尔处理器上设置了 0xc0000082。- 挂钩内核SYSENTER调度程序是否有任何特殊问题?这是因为每当我在负责在远程调试机器(不是VM)上调度SYSENTER调用(KiSystemCall64Shadow)的Windows函数中放置断点时,它都会导致带有UNEXPECTED_KERNEL_MODE_TRAP的BSOD。