LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 964|回复: 1

2.6内核中系统调用的疑问

[复制链接]
发表于 2006-1-31 23:36:58 | 显示全部楼层 |阅读模式
目前查到的int0x80和sysenter两种系统调用的处理流程:
在执行INT指令时,实际完成了以下几条操作:
1.由于INT指令发生了不同优先级之间的控制转移,所以首先从TSS(任务状态段)中获取高优先级的核心堆栈信息(SS和ESP);
2.把低优先级堆栈信息(SS和ESP)保留到高优先级堆栈(即核心栈)中;
3.把EFLAGS,外层CS,EIP推入高优先级堆栈(核心栈)中。
4.通过IDT加载CS,EIP(控制转移至中断处理函数)
在 Ring3 的代码调用了 sysenter 指令之后,CPU 会做出如下的操作:
1.将 SYSENTER_CS_MSR 的值装载到 cs 寄存器
2.将 SYSENTER_EIP_MSR 的值装载到 eip 寄存器
3.将 SYSENTER_CS_MSR 的值加 8(Ring0 的堆栈段描述符)装载到 ss 寄存器。
4.将 SYSENTER_ESP_MSR 的值装载到 esp 寄存器
5.将特权级切换到 Ring0
6.如果 EFLAGS 寄存器的 VM 标志被置位,则清除该标志
7.开始执行指定的 Ring0 代码

有几个问题:
1.int80调用(4)的中断处理函数直接用struct pt_regs regs作参数就可以访问内核栈?初始化regs的工作谁做的?
2.sysenter时低优先级的EIP和ESP什么时候压入内核栈的?在(7)的处理函数之前如何访问压入栈的低优先级EIP和ESP等等?
发表于 2006-3-5 20:40:46 | 显示全部楼层
你上述所看到的仅仅是X86的情况。在标准Linux理论中,系统调用是通过软中断触发的(对于X86来说是INT 80),当系统执行此指令的时候,整个系统就会发生一个中断,此中断导致系统发生了异步上下文切换。在有些体系结构中,此过程可能导致堆栈的切换(如果从用户态切换到内核态,则在某些体系结构下,比如X86,就会自动发生堆栈切换;否则,就不需要发生堆栈切换)。然后,根据协议,系统调用入口程序会在当前堆栈中(肯定是内核堆栈)建立pt_regs,用于记录发生中断时的CPU状态(caller saved register和status register)。所以,上述你说的中断出口函数直接访问regs,是在中断入口程序执行结束的时候。入口程序执行结束后,会调用用户登记的中断出口函数,来进行实际的中断处理
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表