据我所知,通过查看内核代码,linux系统调用返回类型为long int,大小有效32-bit
。
是否可以让linux系统调用返回64-bit
值(类型,比如long long int
)?
据我所知,改变大小毫无意义,但我有兴趣了解这些限制,如果有的话,或者只是偏好。
答案 0 :(得分:6)
在x86上,返回值放在eax
寄存器中,因此不能大于32位;类似地,在x86-64上,它存储在rax
(eax
的64位扩展名)上。
通常,趋势似乎是始终使用寄存器作为返回值(这对系统调用来说似乎是合理的),因此您只能使用当前平台的“本机整数”的大小。如果你需要返回更大的东西,你必须求助于通过指针传递输出的位置。
答案 1 :(得分:6)
我在这个答案中将讨论局限于x86_64和i386:
系统调用声明为long
。
64位内核将64位int值返回给用户空间以进行系统调用。 32位内核将返回一个32位的int值。
但是,假设在32位内核上将系统调用的返回类型更改为long long;那么它们将在%eax和%edx中与LSB一起返回%eax和MSB in%edx
所以你的通话门(条目中的东西)必须确保它不会在iret / ret指令上破坏%eax和%edx。
相应的用户空间包装函数,通过旧系统上的int80或_syscall()宏进行系统调用,或者在较新的系统中重新实现syscall(2)库调用,作为long long返回类型。