2012-10-09 90 views
41

我研究了Linux內核,發現對於x86_64體系結構,中斷int 0x80不起調用系統調用的作用。什麼是更好的「int 0x80」或「系統調用」?

現在的問題是:在x86體系結構的情況下什麼更可取syscallint 0x80爲什麼?

編輯:我使用的內核3.4

+0

你是哪裏的,你所看到的使用'INT 0x80'的內核看?你能指定一些文件嗎? – Mike

+0

@Mike實際上,我發現了一種Linux內核的教程,其中使用了一個示例。它基於2.6。 – Alex

+0

類似於http://stackoverflow.com/q/12776340/841108問題 –

回答

55
  • syscall是在x86-64上進入內核模式的默認方式。該指令不適用於英特爾處理器上的32位操作模式
  • sysenter是最常用於在32位操作模式下調用系統調用的指令。它與syscall類似,但有點難以使用,但這是內核的關注點。
  • int 0x80是調用系統調用的傳統方式,應該避免。

來調用系統調用的優選方式是使用VDSO,存儲器中的每個進程的地址空間,其允許使用系統調用更有效地(例如,通過在某些情況下不進入內核模式在所有映射的一部分)。與傳統的int 0x80方式,處理syscallsysenter指令相比,VDSO也照顧更加困難。

另外,參見thisthis

+4

對於OS內核開發人員來說,選擇其中一個的建議是。然後他們的選擇成爲ABI的一部分,如果您正在開發某個操作系統,則必須遵守該ABI。例如,Linux/i386使用int 0x80並在寄存器中傳遞參數,而MirBSD/i386使用int 0x80並在堆棧上傳遞參數,其間有一個幀指針(這意味着在使用cdecl時在用戶空間中不需要設置成本)。 [這個答案主要針對那些發送到這裏但不是OS內核設計者的人。] – mirabilos

+1

問題在於Linux,答案描述了在Linux(包括i386和x86_64)上調用系統調用的可能方法。你建議Linux/i386只使用'int 0x80',這是不正確的。製作系統調用的最佳方式是使用VDSO。 –

-4

int 0x80是一個更好的術語來表示它的一個系統調用內核告訴它做一些事情。

含義和解釋是可以互換的,'make a syscall'或'issue int 80h'。

這是DOS的日子沒有什麼不同:

  • 調用INT 21H讓DOS上做AX寄存器和可選ES東西depedning:DX寄存器對
  • INT 13H是BIOS硬盤處理程序。
  • int 10h是EGA/VGA屏幕。
  • int 09h是鍵盤處理程序。

這裏的常見主題是,當調用中斷/系統調用時,內核檢查寄存器的狀態以查看需要什麼類型的系統調用。例如,通過查看例如eax寄存器並確定要執行的操作,內部上下文切換到內核空間,執行過程和上下文切換回用戶空間,並帶有選項以返回調用結果,即它是成功還是失敗。

+4

實際上,x86_64指令集有一個'syscall'指令。在這方面,「int 0x80」僅用於32位Linux環境中的系統調用。 –

+1

那麼,公平地說,OP應該已經更清楚了* x86體系結構什麼是更可取的系統調用或者內部0x80 * - 它是含糊不清的,因爲OP指的是x86-64,從這個上下文來看,意味着32位......這使我回答有些誤入歧途或中斷異常:P – t0mm13b

17

我的回答here涵蓋了你的問題。在實踐中,最近的內核正在實現一個VDSO,尤其是動態優化系統調用(內核將VDSO設置爲當前處理器的最佳代碼)。所以你應該使用VDSO,並且你會更好地使用libc提供的接口來獲得現有的系統調用。

請注意,AFAIK是簡單系統調用的一個重要部分,從用戶空間到內核和後端。因此,對於某些系統調用(可能是gettimeofdaygetpid ...),VDSO甚至可能會避免(並且技術上可能會避免執行真正的系統調用)。對於大多數的系統調用(如openreadsendmmap ....)系統調用的內核成本足夠大,以使用戶空間的任何改善內核空間的轉換(例如,使用SYSENTERSYSCALL機器指令,而不是INT )微不足道。

+15

回到80386天,進入內核的最快方式實際上是[執行無效指令](http://blogs.msdn.com/b/oldnewthing/archive/2004 /12/15/313250.aspx)。 –

相關問題