在Linux中返回系统调用的值大小或类型

use*_*614 1 c system-calls linux-kernel

据我所知,从内核代码来看,linux系统调用的返回类型是long int,大小是有效的32-bit.

是否有可能让Linux系统调用返回一个64-bit值(类型,比方说long long int)?

我知道改变大小是没有意义的,但我有兴趣了解有限制,如果有任何或如果这只是一个偏好的问题.

Mat*_*lia 6

在x86上,返回值放在eax寄存器中,因此不能大于32位; 类似地,在x86-64上它存储在rax(64位扩展名eax)上.

通常,趋势似乎是始终使用寄存器作为返回值(这对于系统调用来说似乎是合理的),因此您被限制为当前平台的"本机整数"的大小.如果你需要返回更大的东西,你必须求助于通过指针传递输出的位置.


Ahm*_*sud 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返回类型.