免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1422 | 回复: 0
打印 上一主题 下一主题

Linux 2.6版内核中的快速系统调用(i386) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-05 11:16 |只看该作者 |倒序浏览
Linux内核从2.6版开始引入了对i386快速系统调用指令SYSENTER/SYSEXIT的支持,该方法的最主要优点在于提高了执行从Ring3进入到Ring0的速度。在引入快速系统调用后,内核必须同时支持两种调用方式以保持其兼容性,但也增加了其复杂度。
1、指令介绍
(1)SYSENTER:在用户代码中快速调用一段运行于Ring0的特权代码,该指令可以运行于除实模式在外的任何模式下。
①基本要求
Ⅰ目标Ring0代码段必须是平坦的32位可读可执行的非一致段;
Ⅱ目标Ring0栈段必须是平坦的32位可读可写的向上扩展段;
ⅢRing0和Ring3下的代码段和栈段必须是在GDT中连续的,并且需要在运行前使用特权指令WRMSR来设置寄存器MSR_IA32_SYSENTER_CS、MSR_IA32_SYSENTER_EIP和MSR_IA32_SYSENTER_EIP的值。
②执行顺序
Ⅰ将MSR_IA32_SYSENTER_CS中的值装入CS寄存器;
Ⅱ将MSR_IA32_SYSENTER_EIP中的值装入EIP寄存器;
Ⅲ将MSR_IA32_SYSENTER_CS中的值加8后装入SS寄存器;
Ⅳ将MSR_IA32_SYSENTER_ESP中的值装入ESP寄存器;
Ⅴ处理器切换到Ring0特权级;
Ⅵ将EFLAGS寄存器中的VM位清0;
Ⅶ开始执行指定的特权代码。
(2)SYSEXIT:从正在执行的Ring0特权代码中返回到Ring3中,该指令只能在Ring0权限下被调用。其基本要求和SYSENTER指令的类似。执行该指令后,处理器依次进行以下操作:
Ⅰ将MSR_IA32_SYSENTER_CS中的值加16后装入CS寄存器;
Ⅱ将EDX中的值装入EIP寄存器;
Ⅲ将MSR_IA32_SYSENTER_CS中的值加24后装入SS寄存器;
Ⅳ将ECX中的值装入ESP寄存器;
Ⅴ处理器切换到Ring3特权级;
Ⅵ开始执行指定的代码。
2、初始化
在系统初始化内核时,系统会调用arch/i386/kernel/sysenter.c文件中的enable_sep_cpu()函数进行初始化,该函数进行的基本工作如下:
(1)检验CPU是否支持快速系统调用,如果不支持则结束;
(2)将内核代码段__KERNEL_CS装入到MSR_IA32_SYSENTER_CS中;
(3)将TSS的结束地址装入到MSR_IA32_SYSENTER_ESP中;
解释:在每次发生进程调度时,内核都将当前进程的内核栈指针保存在TSS的esp0域中。系统调用的处理函数从ESP中读取到TSS的地址,从而计算esp0域的地址,并从而读取到内核栈的指针。所以,内核将该地址初始化为TSS的结束地址。
(4)将arch/i386/kernel/entry.S文件中sysenter_entry的地址装入到MSR_IA32_SYSENTER_EIP中。
此外,系统还会调用arch/i386/kernel/sysenter.c文件中的sysenter_setup()函数进行初始化。该函数会构建一个名为syscall_page的页面(其中的代码根据是否支持快速系统调用来提供不同的系统调用入口代码),其中包含一段ELF动态链接库代码,会在有ELF程序被执行时自动链接到其的地址空间上。
3、快速系统调用的基本执行顺序
(1)库函数将系统调入号保存到EAX中,并调用arch/i386/kernel/vsyscall-sysenter.S文件中的__kernel_vsyscall函数;
(2)__kernel_vsyscall将ECX、EDX和EBP保存到用户态的栈中,将该栈ESP保存到EBP中,并执行SYSENTER指令;
(3)系统从用户态进入到核心态,执行arch/i386/kernel/entry.S文件中的sysenter_entry函数(该函数的地址保存在MSR_IA32_SYSENTER_EIP中);
(4)sysenter_entry首先将内核栈指针装入ESP,并开启中断允许,将用户数据段、用户栈指针、EFLAGS寄存器、用户代码段和返回地址保存到内核栈,然后将从用户栈传递的第六个参数保存到EBP中,最后调用相应的系统调用处理函数进行服务;
(5)在系统调用处理函数执行完成后,通过执行SYSEXIT指令返回到用户态。




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/27624/showart_226695.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP