2012-02-03 65 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

相關問題