sysenter之后调用什么指令?
下一条指令是否保存在寄存器中?
mov edx,esp
sysenter
#1 楼
这是sysenter
的工作原理的完美解释:http://www.osronline.com/article.cfm?id=257 本质上:
来自用户模式的所有本机API调用都有一个只需将索引加载到EAX中的主体,执行
SystemCallStub
并返回SystemCallStub将指向用户模式堆栈顶部的指针保存到EDX中,并执行SYSENTER指令
SYSENTER禁用中断,将线程切换到内核模式,并执行位于SYSENTER_EIP_MSR中的指令(在XP SP1上为KiFastCallEntry)。
KiFastCallEntry
生成陷阱帧,以便在返回用户模式时知道去向,启用中断并跳入KiSystemService
KiSystemService
,除其他外,从用户堆栈中复制参数(由EDX指向),并获取先前存储在EAX中的值并执行位于以下位置的函数KiServiceTable [EAX] 现在,本机API在内核模式下以线程集的先前模式执行到用户模式
评论
您到底能说出在返回用户模式后调用sysenter之后将地址eiP保存在什么地方?
–user2522767
2014年9月24日12:16
返回用户模式后,将使用陷阱帧并为EIP进行设置。了解陷阱框架如何正确工作
– pHiL
2014年9月24日12:33
你是说无处储蓄吗?您能给我看看有关陷井框架工作的参考资料吗?坦克斯
–user2522767
2014年9月24日12:49
陷阱帧设置为内核模式,因此您无法从用户模式对其进行修改。如果您想了解更多,请搜索“中断,陷阱,异常”
– pHiL
2014-09-25 9:38
#2 楼
SYSENTER
指令影响许多寄存器,但最重要的是,它将EIP
设置为SYSENTER_EIP_MSR
寄存器的值(在IA-32术语中)。 Windows在引导时将SYSENTER_EIP_MSR
设置为ntoskrnl!KiFastCallEntry()
的地址。因此,在较高级别上,
SYSENTER
会“跳转”到ntoskrnl!KiFastCallEntry()
。有关更多详细信息,请参见http ://www.codeguru.com/cpp/misc/misc/system/article.php/c8223/%22System-Call-Optimization-with-the-SYSENTER-Instruction.htm和http://trapframe.org/just-足够的内核可以得到2 /。
评论
它进入环0,通常edx指向参数,而eax是要执行的操作的“ id”sysenter如何在Linux下工作的可能重复方式?
我怀疑sysenter在Linux和Windows上的工作原理相同...但是,我没有在Windows上尝试过,因此您需要尝试一下。
@perror:链接的问题说明了如何使用sysenter调用Linux syscall。它没有说明systenter在CPU级别上如何工作。
@Igor:对,我可能误解了这个问题。对不起。