我研究了Linux內核,發現對於x86_64
體系結構,中斷int 0x80
不起調用系統調用的作用。什麼是更好的「int 0x80」或「系統調用」?
現在的問題是:在x86
體系結構的情況下什麼更可取syscall
或int 0x80
爲什麼?
編輯:我使用的內核3.4
我研究了Linux內核,發現對於x86_64
體系結構,中斷int 0x80
不起調用系統調用的作用。什麼是更好的「int 0x80」或「系統調用」?
現在的問題是:在x86
體系結構的情況下什麼更可取syscall
或int 0x80
爲什麼?
編輯:我使用的內核3.4
syscall
是在x86-64
上進入內核模式的默認方式。該指令不適用於英特爾處理器上的32位操作模式。sysenter
是最常用於在32位操作模式下調用系統調用的指令。它與syscall
類似,但有點難以使用,但這是內核的關注點。int 0x80
是調用系統調用的傳統方式,應該避免。來調用系統調用的優選方式是使用VDSO,存儲器中的每個進程的地址空間,其允許使用系統調用更有效地(例如,通過在某些情況下不進入內核模式在所有映射的一部分)。與傳統的int 0x80
方式,處理syscall
或sysenter
指令相比,VDSO也照顧更加困難。
對於OS內核開發人員來說,選擇其中一個的建議是。然後他們的選擇成爲ABI的一部分,如果您正在開發某個操作系統,則必須遵守該ABI。例如,Linux/i386使用int 0x80並在寄存器中傳遞參數,而MirBSD/i386使用int 0x80並在堆棧上傳遞參數,其間有一個幀指針(這意味着在使用cdecl時在用戶空間中不需要設置成本)。 [這個答案主要針對那些發送到這裏但不是OS內核設計者的人。] – mirabilos
問題在於Linux,答案描述了在Linux(包括i386和x86_64)上調用系統調用的可能方法。你建議Linux/i386只使用'int 0x80',這是不正確的。製作系統調用的最佳方式是使用VDSO。 –
int 0x80
是一個更好的術語來表示它的一個系統調用內核告訴它做一些事情。
含義和解釋是可以互換的,'make a syscall'或'issue int 80h'。
這是DOS的日子沒有什麼不同:
這裏的常見主題是,當調用中斷/系統調用時,內核檢查寄存器的狀態以查看需要什麼類型的系統調用。例如,通過查看例如eax
寄存器並確定要執行的操作,內部上下文切換到內核空間,執行過程和上下文切換回用戶空間,並帶有選項以返回調用結果,即它是成功還是失敗。
實際上,x86_64指令集有一個'syscall'指令。在這方面,「int 0x80」僅用於32位Linux環境中的系統調用。 –
那麼,公平地說,OP應該已經更清楚了* x86體系結構什麼是更可取的系統調用或者內部0x80 * - 它是含糊不清的,因爲OP指的是x86-64,從這個上下文來看,意味着32位......這使我回答有些誤入歧途或中斷異常:P – t0mm13b
我的回答here涵蓋了你的問題。在實踐中,最近的內核正在實現一個VDSO,尤其是動態優化系統調用(內核將VDSO設置爲當前處理器的最佳代碼)。所以你應該使用VDSO,並且你會更好地使用libc提供的接口來獲得現有的系統調用。
請注意,AFAIK是簡單系統調用的一個重要部分,從用戶空間到內核和後端。因此,對於某些系統調用(可能是gettimeofday
,getpid
...),VDSO甚至可能會避免(並且技術上可能會避免執行真正的系統調用)。對於大多數的系統調用(如open
,read
,send
,mmap
....)系統調用的內核成本足夠大,以使用戶空間的任何改善內核空間的轉換(例如,使用SYSENTER
或SYSCALL
機器指令,而不是INT
)微不足道。
回到80386天,進入內核的最快方式實際上是[執行無效指令](http://blogs.msdn.com/b/oldnewthing/archive/2004 /12/15/313250.aspx)。 –
在更改之前注意這一點:系統調用號碼不同 0x80或系統調用時,例如sys_write是4,0x80和1系統調用。
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html爲32位或0x80的 http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64的系統調用
你是哪裏的,你所看到的使用'INT 0x80'的內核看?你能指定一些文件嗎? – Mike
@Mike實際上,我發現了一種Linux內核的教程,其中使用了一個示例。它基於2.6。 – Alex
類似於http://stackoverflow.com/q/12776340/841108問題 –