linux 为什么'x86-64'和'x32'的系统调用号不同但相似,为什么有些没有在unistd_x32.h中定义?

41zrol4v  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(229)

在阅读了更多关于特定体系结构的系统调用号之后,我在Linux上遇到了这些文件。
当我运行这个命令locate unistd_64.h时,它给了我一个到系统调用文件/usr/include/asm/unistd_64.h的路径,但是当我查看asm文件夹时,我发现还有另外两个文件(unistd_32.hunistd_x32.h)。我知道它们是为不同的体系结构而存在的。
我观察到的是unistd_64.hunistd_32.h的系统调用号完全不同。
第一个
我认为这是因为unistd_32.h支持i386体系结构,我认为它将只允许4GB的RAM与32 bit,也许和unistd_64.h支持x86-64体系结构,我们可以有18-Quintillion字节的RAM最大。
我不明白的是,这个unistd_x32.h文件代表什么?如果我们看到它的内容,它与unistd_64.h非常相似,所以我猜系统调用编号毕竟是相同的,但它确实有一个新的宏或变量__X32_SYSCALL_BIT。我不明白为什么我们要添加这个?

// unistd_x32.h

#define __NR_read (__X32_SYSCALL_BIT + 0)
#define __NR_write (__X32_SYSCALL_BIT + 1)
#define __NR_open (__X32_SYSCALL_BIT + 2)
#define __NR_close (__X32_SYSCALL_BIT + 3)
#define __NR_stat (__X32_SYSCALL_BIT + 4)
#define __NR_fstat (__X32_SYSCALL_BIT + 5)

此外,在unistd_x32.h版本中缺少几个系统调用号,就像我们有#define __NR_rt_sigaction 13,这个系统调用在unistd_64.h中,但是在x32版本中没有。有很多这样的系统调用。那么如果我假设x32基本上是32 bit pointer architecture,但是它可以在64位版本上运行?所以即使我们有更多的RAM,它也只能访问4GB的RAM?如果我说错了,请纠正我。

ffscu2ro

ffscu2ro1#

是的,Linux的x32 ABI是用于64位模式的ILP 32 ABI。https://en.wikipedia.org/wiki/X32_ABI
正如你所看到的,它的系统调用数和x86-64的不一样,因为指针宽度不同,而且保存指针的参数传递寄存器的前32位可能有很高的垃圾,内核需要忽略这一点,只使用寄存器低半部分的32位指针。
此外,一些结构体布局可能不同,因为long在x32 ABI中是32位类型。

相关问题