Linux-Kernel

mmap 如何與 x32 ABI 配合使用?

  • February 7, 2019

我在查看 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

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