Linux-Kernel
mmap 如何與 x32 ABI 配合使用?
我在查看 Linux 5.0-rc5 原始碼
arch/x86/entry/syscalls/syscall_64.tbl
,發現 x32 沒有單獨的系統呼叫號mmap
。那麼核心如何知道我們在使用者空間中使用 x32 ABI,所以不給我們超過 4GiB 的映射地址?
或者一般來說,可能返回地址的系統呼叫如何知道我們正在使用 x32 而不是返回超過 4GiB 的地址?
想要進行 x32 系統呼叫的程序將在系統呼叫號中設置一個位,這將允許核心區分它們。
從 syscall(2) 聯機幫助頁:
[5] The x32 ABI uses the same instruction as the x86_64 ABI and is used on the same processors. To differentiate between them, the bit mask __X32_SYSCALL_BIT is bitwise-ORed into the system call number for system calls under the x32 ABI. Both system call tables are available though, so setting the bit is not a hard requirement.
x32 並不是真正的獨立環境;x32 程序可以進行 x64 系統呼叫,反之亦然;這與 ia32 仿真不同,它也可以與 x64 和 x32 並排支持。
該位通過以下
in_x32_syscall()
函式在核心中檢查:static inline bool in_x32_syscall(void) { #ifdef CONFIG_X86_X32_ABI if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) return true; #endif return false; }
查找核心程式碼實現在哪裡
mmap()
檢查它留給讀者作為練習(這並不難)。在 x32 二進製文件的 execve() 的情況下,核心還將__X32_SYSCALL_BIT
在保存的寄存器(系統呼叫號)上顯式設置自身。RAX