Linux

int 0x80 後面的呼叫約定是什麼?

  • May 30, 2018

我知道有一個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

我在這裡讀到後面的參數rdxesi, edi, ebp(或對於 x64 rsi, rdi, rbp),我沒有在Wikipedia 的呼叫約定頁面中看到它,但int80h似乎表明 Windows 也使用此約定?

這個約定叫什麼。我可以在 Linux 核心原始碼的什麼位置看到它的定義?而且,在rax您呼叫時解析為過程的表在哪裡int 0x80?對於syscall,sys_writerax=1

您的問題涵蓋了許多主題,我將嘗試解決所有問題。

  1. 我不確定呼叫系統呼叫的方式是否有一個單一的規範術語,更不用說呼叫系統呼叫的特定方式(中斷 0x80 而不是SYSENTERor SYSCALL)。在 x86-64 上,系統 V x86-64 ABI 中描述了已記錄的系統呼叫介面 using SYSCALL,但這只是提供資訊,而不是規範。同樣,如果您將其稱為“i386 Linux 核心 ABI”(將“i386”替換為您所談論的任何架構),大多數人都會理解您在說什麼,但由於“核心 ABI”,這也可能令人困惑有另一個含義(在核心模組的上下文中),並且不限於中斷 0x80。

在實踐中,大多數人不應該關心細節到這個細節級別,特別是因為它們可以演變:SYSCALL正如你提到的那樣,中斷 0x80 等,而且 vDSO 也引入了自己的微妙之處並且是首選的入口點對於當今 x86 上的所有系統呼叫……當然,這並不意味著不能有一個術語來指代特定的呼叫約定,但我不確定它是否有用。 2. Windows 還支持為其係統呼叫介面 0x2E 使用中斷,但它的“呼叫約定”完全不同:參數被壓入堆棧,請求的系統呼叫由 EAX 給出,而 EBX 指向堆棧上的參數。 3. 目前的 x86 核心定義了系統呼叫介面arch/x86/entryentry_32.S包含 i386 介面、entry_64.Sx86-32 和 x86-64 介面、entry_64_compat.S32 位 x86-64 介面(用於向後兼容)、syscalls/syscall_32.tbli386 系統呼叫表、syscalls/syscall_64.tblx86-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;設備驅動程序大多使用不同的介面)。

引用自:https://unix.stackexchange.com/questions/446818