在阅读了更多关于特定体系结构的系统调用号之后,我在Linux上遇到了这些文件。
当我运行这个命令locate unistd_64.h
时,它给了我一个到系统调用文件/usr/include/asm/unistd_64.h
的路径,但是当我查看asm
文件夹时,我发现还有另外两个文件(unistd_32.h
,unistd_x32.h
)。我知道它们是为不同的体系结构而存在的。
我观察到的是unistd_64.h
和unistd_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?如果我说错了,请纠正我。
1条答案
按热度按时间ffscu2ro1#
是的,Linux的x32 ABI是用于64位模式的ILP 32 ABI。https://en.wikipedia.org/wiki/X32_ABI。
正如你所看到的,它的系统调用数和x86-64的不一样,因为指针宽度不同,而且保存指针的参数传递寄存器的前32位可能有很高的垃圾,内核需要忽略这一点,只使用寄存器低半部分的32位指针。
此外,一些结构体布局可能不同,因为
long
在x32 ABI中是32位类型。