System Call
发表于 2006-01-22 07:40 AM 作者: zweily
注:同上篇《Stack》,IA-32笔记,有空再作补充。
IA-32 before PentiumII —— 没有SYSENTER和SYSEXIT指令的年代
系统调用需要通过Exception Handler来Dispatch。对于Windows NT/2000而言,利用int 0x2e来实现。而在系统调用的时候,需要进行栈切换的工作。由于Interrupt/Exception Handler的调用都是通过 call/trap/task这一类的gate来实现的,这种方式会进行栈切换,并且系统栈的地址等信息由TSS提供。这种方式可能会引起多次内存访问(来获取这些切换信息),因此,从PentiumII开始,IA-32引入了新指令:SYSENTER/SYSEXIT。
SYSENTER/SYSEXIT
这对指令专门用于实现系统调用。从用户级到特权级的堆栈以及指令指针的转换,可以通过这一条指令来实现,并且,需要切换到的新堆栈的地址,以及相应过程的第一条指令的位置,都有一组特殊寄存器来实现,这类特殊寄存器在IA-32中称为MSR(Model Specific Register)。这里牵涉到3个特殊寄存器:
SYSENTER_CS_MSR: New code segment selector 0x174
SYSENTER_ESP_MSR: New Stack Pointer 0x175
SYSENTER_EIP_MSR: New Instruction Pointer 0x176
这里标出的3个16进制数分别对应这3个寄存器的地址,该地址用于Kernel debug时,通过rdmsr/wrmsr指令来读/写这3个寄存器。上面的注释也很明显地解释了这3个寄存器的作用。 因此,在Windows XP/2003以上的系统,都会优先考虑这种方式来实现系统调用。当然,如果是在 PentiumII以前的机器上运行的话,那么仍旧使用原来的那套机制。
说明:在Intel实现这对指令的同时, AMD也提供了一对相似的指令:SYSCALL/SYSRET,其工作方式与IA-32的这套类似,不过寄存器有些不同,由于手头没有相关资料,所以具体的区别就不是很清楚了。Windows XP/2003同样支持AMD的这套指令。
IA-32 before PentiumII —— 没有SYSENTER和SYSEXIT指令的年代
系统调用需要通过Exception Handler来Dispatch。对于Windows NT/2000而言,利用int 0x2e来实现。而在系统调用的时候,需要进行栈切换的工作。由于Interrupt/Exception Handler的调用都是通过 call/trap/task这一类的gate来实现的,这种方式会进行栈切换,并且系统栈的地址等信息由TSS提供。这种方式可能会引起多次内存访问(来获取这些切换信息),因此,从PentiumII开始,IA-32引入了新指令:SYSENTER/SYSEXIT。
SYSENTER/SYSEXIT
这对指令专门用于实现系统调用。从用户级到特权级的堆栈以及指令指针的转换,可以通过这一条指令来实现,并且,需要切换到的新堆栈的地址,以及相应过程的第一条指令的位置,都有一组特殊寄存器来实现,这类特殊寄存器在IA-32中称为MSR(Model Specific Register)。这里牵涉到3个特殊寄存器:
SYSENTER_CS_MSR: New code segment selector 0x174
SYSENTER_ESP_MSR: New Stack Pointer 0x175
SYSENTER_EIP_MSR: New Instruction Pointer 0x176
这里标出的3个16进制数分别对应这3个寄存器的地址,该地址用于Kernel debug时,通过rdmsr/wrmsr指令来读/写这3个寄存器。上面的注释也很明显地解释了这3个寄存器的作用。 因此,在Windows XP/2003以上的系统,都会优先考虑这种方式来实现系统调用。当然,如果是在 PentiumII以前的机器上运行的话,那么仍旧使用原来的那套机制。
说明:在Intel实现这对指令的同时, AMD也提供了一对相似的指令:SYSCALL/SYSRET,其工作方式与IA-32的这套类似,不过寄存器有些不同,由于手头没有相关资料,所以具体的区别就不是很清楚了。Windows XP/2003同样支持AMD的这套指令。
评论总数 1
评论
| | SYSCALL/SYSRET 在intel 64 and ia-32软件开发者手册第二卷第三章和第三卷第四章都有讲解 我目前正在翻译第三卷第四掌。 |
| 发表于 2008-01-18 04:41 PM 作者: dxc(dxcnjupt@126.com) |
发表评论 |
作者为 zweily 的最新文章
- ARM平台的对齐问题 (2006-08-13)
- System Call (2006-01-22)
- Stack (2006-01-22)
- ZWeily的小品文——《Something about TCP/IP》系列(1) (2006-01-22)
- ZWeily的小品文(六)C++入门教程(5) (2006-01-22)




