2012-02-03 112 views
4

所有教科书和互联网资源告诉我int 80h是调用系统调用的陈旧风格,并已被x86平台上的SYSENTER所取代。为什么用int80h代替sysenter来调用系统调用?

但我刚刚发现我的系统仍然使用int 80h。我知道教科书的东西像VDSO,实现系统调用服务的libc包装,但不明白为什么int 80h仍然默认使用。

  1. 有人可以告诉我原因吗? glibc或内核太旧了?

  2. 时下在什么条件下默认仍然使用“int 80h”?

  3. 如何在不安装新的glibc的情况下执行sysenter?


下面是我的环境:

我安装使用VMWare虚拟机上我的MacBook Air 2011(酷睿双核CPU)。 VM中的32位Ubuntu 8.04/kernel 2.6.24(使用原始.config编译)/ libc 2.7。

+0

[这里](http://stackoverflow.com/questions/2747187/how-to-find-which-type-of-system-call-is-used-by-a-program)是一个很好的链接如何确定在系统中使用int 80h和sysenter的机制。但它并不能解决我的惊讶,我的系统仍然使用int 80h。我只是gdb-ed一个可执行文件,发现“int 80h”实际上是用glibc编码的。就我而言,内核提供的VDSO不被使用。 – Infinite 2012-02-03 22:50:11

+0

经过一番调查后,我确信内核确实提供了vsyscall页面。只是glibc被配置为直接使用int 80h。我想这是为8.04版本配置这种libc的Ubuntu用户的选择。 – Infinite 2012-02-03 23:54:04

回答

2

最可能出于兼容性的原因 - 32位Ubuntu编译为兼容i386处理器(当然也许不是那么古老),它不支持sysenter(它只出现在Pentium 2 AFAIK上)。显然,使用SYSENTER对INT 80H是真的benefical仅在某些类型的处理器:

http://articles.manugarg.com/systemcallinlinux2_6.html

因此,如果是在一般情况下,更广泛的兼容性没有显著速度增益,用INT 80H在SYSENTER还算说得过去, 即使在今天。如果您使用的是64位版本的Ubuntu,那么sysenter/sysexit会在整个地方使用。

编辑:实际上,系统调用机制是由内核在启动时决定的,而不是由glibc决定的。 This page(4.6节)解释了这是如何工作的。在你的情况中,只有内核认为由VMware模拟的硬件才会使用int 80h而不是sysenter更高效。你将不得不调试内核,以弄清楚它是如何做出这个决定的。

+0

这是非常合理的!我猜,兼容性是Ubuntu发布的首要关注点之一。 – Infinite 2012-02-05 07:09:25

+0

但正如Peter指出的那样,内核使用vsyscall解决了兼容性问题,无论处理器是否具有sysenter指令,那么为什么在Ubuntu中配置的glibc不能简单地使用vsyscall? – Infinite 2012-02-05 08:33:59

+0

用您的最后一个问题的潜在答案编辑我的文章。 – Gnurou 2012-02-07 01:43:23

2

什么指令(int80或sysenter)总是由来宾操作系统本身决定的,就像你从Linux内核源代码中看到的 - 这一切都取决于VMware提供给它的硬件。

看一下文件拱/ 86/VDSO/vdso32-setup.c中(Linux内核源代码):

if (vdso32_syscall()) { 
      vsyscall = &vdso32_syscall_start; 
      vsyscall_len = &vdso32_syscall_end - &vdso32_syscall_start; 
    } else if (vdso32_sysenter()){ 
      vsyscall = &vdso32_sysenter_start; 
      vsyscall_len = &vdso32_sysenter_end - &vdso32_sysenter_start; 
    } else { 
      vsyscall = &vdso32_int80_start; 
      vsyscall_len = &vdso32_int80_end - &vdso32_int80_start; 
    } 

从上面可以看出U,要使用int80的决定只有当SYSENTER特征检测失败。此功能通过VMWare的仿真引擎呈现给访客。也许如果你使用的是最新版本的VMware,再加上一些现代硬件,VMware应该为客人提供一个更现代化的操作系统。

+0

的确如此。内核会检测sysenter/syscall的可用性以生成vsyscall。例如,就我而言,vsyscall页面包含处理系统调用的sysenter指令。但是,glibc直接调用int 80h而不是调用%gs:10h(vsyscall的条目),这意味着glibc将忽略vsyscall。 – Infinite 2012-02-05 08:18:47