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