Linux 2.6 中快速系统调用指令 SYSENTER/SYSEXIT 的实现与优化

0 下载量 183 浏览量 更新于2024-09-06 收藏 93KB DOC 举报
Linux 2.6 对新型 CPU 快速系统调用的支持 本文分析了 Linux 2.6 中引入的对 Intel CPU 快速系统调用指令 SYSENTER/SYSEXIT 支持的实现。Linux 驱动及内核开发者通过了解快速系统调用指令的机制,可以在自己的代码中通过利用这一机制,提高系统性能,并避开由快速系统调用方式带来的一些局限(如系统调用中嵌套系统调用)。 Linux 2.4 中的系统调用机制是通过软中断指令(int 0x80)实现的。在 x86 保护模式中,处理 INT 中断指令时,CPU 首先从中断描述表 IDT 取出对应的门描述符,判断门描述符的种类,然后检查门描述符的级别 DPL 和 INT 指令调用者的级别 CPL,当 CPL<=DPL 也就是说 INT 调用者级别高于描述符指定级别时,才能成功调用,最后再根据描述符的内容,进行压栈、跳转、权限级别提升。内核代码执行完毕之后,调用 IRET 指令返回,IRET 指令恢复用户栈,并跳转回低级别的代码。 然而,在发生系统调用,由 Ring3 进入 Ring0 的这个过程浪费了不少的 CPU 周期,例如,系统调用必然需要由 Ring3 进入 Ring0(由内核调用 INT 指令的方式除外,这多半属于 Hacker 的内核模块所为),权限提升之前和之后的级别是固定的,CPL 肯定是 3,而 INT80 的 DPL 肯定也是 3,这样 CPU 检查门描述符的 DPL 和调用者的 CPL 就是完全没必要。正是由于如此,Intel x86 CPU 从 PII300(Family6,Model 3,Stepping3)之后,开始支持新的系统调用指令 sysenter/sysexit。sysenter 指令用于由 Ring3 进入 Ring0,SYSEXIT 指令用于由 Ring0 返回 Ring3。由于没有特权级别检查的处理,也没有压栈的操作,所以执行速度比 INT n/IRET 快了不少。 sysenter/sysexit 指令的优点在于,它可以减少系统调用的开销,避免了 INT n/IRET 指令中的权限级别检查和压栈操作,从而提高了系统性能。此外,sysenter/sysexit 指令还可以避免系统调用中嵌套系统调用的问题,提高了系统的可靠性和安全性。 在 Linux 2.6 中,对 sysenter/sysexit 指令的支持可以分为两个部分:一是 sysenter 指令的支持,用于由 Ring3 进入 Ring0;二是 SYSEXIT 指令的支持,用于由 Ring0 返回 Ring3。Linux 驱动及内核开发者可以通过了解 sysenter/sysexit 指令的机制,在自己的代码中通过利用这一机制,提高系统性能,并避开由快速系统调用方式带来的一些局限。 此外,在 Linux 2.6 中,还提供了一些其他的优化机制,例如缓存优化、锁优化等,都是为了提高系统性能和可靠性。因此, Linux 驱动及内核开发者需要了解这些优化机制,并在自己的代码中实施,以提高系统性能和可靠性。 Linux 2.6 中对 sysenter/sysexit 指令的支持可以提高系统性能,避免系统调用中嵌套系统调用的问题,提高系统的可靠性和安全性。Linux 驱动及内核开发者需要了解 sysenter/sysexit 指令的机制,并在自己的代码中实施,以提高系统性能和可靠性。