返回   cpper编程论坛 > Blog > zweily
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

为这篇文章评分

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的这套指令。
评论 1 Email文章
评论总数 1

评论

旧
SYSCALL/SYSRET
在intel 64 and ia-32软件开发者手册第二卷第三章和第三卷第四章都有讲解
我目前正在翻译第三卷第四掌。
发表于 2008-01-18 04:41 PM 作者: dxc(dxcnjupt@126.com)
发表评论 发表评论
作者为 zweily 的最新文章

所有时间均为格林尼治时间 +9。现在的时间是 01:05 PM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0