Linux2.6对新型CPU快速系统调用的支持
http://tech.ddvip.com 2006年11月20日 社区交流
本文详细介绍Linux2.6对新型CPU快速系统调用的支持
2.6 内核在启动的时候,调用了新增的函数 sysenter_setup(参见 arch/i386/kernel/sysenter.c),在这个函数中,内核将虚拟内存空间的顶端一个固定地址页面(从 0xffffe000 开始到 0xffffeffff 的 4k 大小)映射到一个空闲的物理内存页面。然后通过之前执行 CPUID 的指令得到的数据,检测 CPU 是否支持 sysenter/sysexit 指令。如果 CPU 不支持,那么将采用 INT 调用方式的入口代码拷贝到这个页面中,然后返回。相反,如果 CPU 支持 SYSETER/SYSEXIT 指令,则将采用 SYSENTER 调用方式的入口代码拷贝到这个页面中。使用宏 on_each_cpu 在每个 CPU 上执行 enable_sep_cpu 这个函数。
在 enable_sep_cpu 函数中,内核将当前 CPU 的 TSS 结构中的 ss1 设置为当前内核使用的代码段,esp1 设置为该 TSS 结构中保留的一个 256 字节大小的堆栈。在 X86 中,TSS 结构中 ss1 和 esp1 本来是用于保存 Ring 1 进程的堆栈段和堆栈指针的。由于内核在启动时,并不能预知调用 sysenter 指令进入 Ring 0 后 esp 的确切值,而应用程序又无权调用 wrmsr 指令动态设置,所以此时就借用 esp1 指向一个固定的缓冲区来填充这个 MSR 寄存器,由于 Ring 1 根本没被启用,所以并不会对系统造成任何影响。在下面的文章中会介绍进入 Ring 0 之后,内核如何修复 ESP 来指向正确的 Ring 0 堆栈。关于 TSS 结构更细节的应用可参考代码 include/asm-i386/processor.h)。
然后,内核通过 wrmsr (msr,val1,val2) 宏调用 wrmsr 指令对当前 CPU 设置 MSR 寄存器,可以看出调用宏的第三个参数即 edx 都被设置为 0。其中 SYSENTER_CS_MSR 的值被设置为当前内核用的所在代码段;SYSENTER_ESP_MSR 被设置为 esp1,即指向当前 CPU 的 TSS 结构中的堆栈;SYSENTER_EIP_MSR 则被设置为内核中处理 sysenter 指令的接口函数 sysenter_entry(参见 arch/i386/kernel/entry.S)。这样,sysenter 指令的准备工作就完成了。
责编:豆豆技术应用
- Linux/Unix 新闻
- Linux/Unix 入门
- Linux/Unix 命令
- Linux/Unix 安装
- Linux 嵌入式系统
- Linux/Unix 编程
- Linux/Unix 管理
- Linux/Unix 桌面
- Linux/Unix 内核
- Linux/Unix 软件
- SCO Unix
- NetBSD
- OpenBSD
- Redhat/Fedora Linux
- 手机
- Linux/Unix find 搜索命令
- Linux/Unix vi 命令
- Linux/Unix kde 桌面环境
- Linux/Unix GNOME 桌面环境
- Linux/Unix Make 命令
- Linux/Unix crontab 命令
- Linux/Unix ext3 文件系统
- Linux/Unix 文件系统详解
- Linux/Unix ADSL 拨号设置
- Linux/Unix GRUB 配置及应用
- Linux/Unix nfs配置
- Linux/Unix 硬件信息查看及管理
- Linux/Unix 优化
- Linux/Unix 交换分区Swap管理及应用
- Linux/Unix 用户管理
- Linux/Unix Ramdisk
- Linux/Unix 密码恢复管理
- Linux/Unix 文件删除恢复
- Linux/Unix fdisk分区
- Linux/Unix lvs负载均衡管理
- Linux/Unix root用户
- Linux/Unix 集群
- Linux/Unix 日志
- 更多Linux/Unix专题……