int 0x80
後面的呼叫約定是什麼?
我知道有一個
syscall
約定,但是當您呼叫int 80
而不是syscall
像這樣時,您會看到它之前的呼叫約定是什麼。mov rax,4 ; system call number (sys_write) mov rbx,1 ; file descriptor (stdout) mov rcx,hello ; message to write mov rdx,12 ; message length int 0x80 ; call kernel
我在這裡讀到後面的參數
rdx
是esi
,edi
,ebp
(或對於 x64rsi
,rdi
,rbp
),我沒有在Wikipedia 的呼叫約定頁面中看到它,但int80h似乎表明 Windows 也使用此約定?這個約定叫什麼。我可以在 Linux 核心原始碼的什麼位置看到它的定義?而且,在
rax
您呼叫時解析為過程的表在哪裡int 0x80
?對於syscall
,sys_write
是rax=1
您的問題涵蓋了許多主題,我將嘗試解決所有問題。
- 我不確定呼叫系統呼叫的方式是否有一個單一的規範術語,更不用說呼叫系統呼叫的特定方式(中斷 0x80 而不是
SYSENTER
orSYSCALL
)。在 x86-64 上,系統 V x86-64 ABI 中描述了已記錄的系統呼叫介面 usingSYSCALL
,但這只是提供資訊,而不是規範。同樣,如果您將其稱為“i386 Linux 核心 ABI”(將“i386”替換為您所談論的任何架構),大多數人都會理解您在說什麼,但由於“核心 ABI”,這也可能令人困惑有另一個含義(在核心模組的上下文中),並且不限於中斷 0x80。在實踐中,大多數人不應該關心細節到這個細節級別,特別是因為它們可以演變:
SYSCALL
正如你提到的那樣,中斷 0x80 等,而且 vDSO 也引入了自己的微妙之處並且是首選的入口點對於當今 x86 上的所有系統呼叫……當然,這並不意味著不能有一個術語來指代特定的呼叫約定,但我不確定它是否有用。 2. Windows 還支持為其係統呼叫介面 0x2E 使用中斷,但它的“呼叫約定”完全不同:參數被壓入堆棧,請求的系統呼叫由 EAX 給出,而 EBX 指向堆棧上的參數。 3. 目前的 x86 核心定義了系統呼叫介面arch/x86/entry
:entry_32.S
包含 i386 介面、entry_64.S
x86-32 和 x86-64 介面、entry_64_compat.S
32 位 x86-64 介面(用於向後兼容)、syscalls/syscall_32.tbl
i386 系統呼叫表、syscalls/syscall_64.tbl
x86-32 和x86-64 系統呼叫表。這些文件中的註釋記錄了介面,特別是參數的傳遞方式:對於 32 位呼叫,EAX 包含系統呼叫號,其參數放置在 EBX、ECX、EDX、ESI、EDI 和 EBP(參數本身為
SYSENTER
,指向使用者堆棧的指針,其中包含中斷 0x80 的參數);對於 64 位呼叫,RAX 包含系統呼叫號,其參數放在 RDI、RSI、RDX、R10、R8 和 R9 中(另請參閱為什麼系統呼叫寄存器和順序從 Intel 32bit 更改為 64bit?) . 有一個很好的總結,裡面有圖表calling.h
。附帶說明一下,歷史比較通常指的是 MS-DOS 呼叫介面,該介面主要使用中斷 0x21;它還包括多路復用中斷0x2F,它提供了一種可擴展的機制來添加系統服務(通常涉及 TSR;設備驅動程序大多使用不同的介面)。