3

据我了解,从内核代码来看,linux系统调用返回类型为long int,大小为有效32-bit

是否可以让 linux 系统调用返回一个64-bit值(例如,类型long long int)?

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

4

2 回答 2

7

在 x86 上,返回值放在eax寄存器中,所以不能大于 32 位;同样,在 x86-64 上,它存储在rax(的 64 位扩展名eax)上。

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

于 2013-06-07T22:10:59.680 回答
6

在这个答案中,我将我的讨论限制在 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 返回类型。

于 2013-06-07T22:29:26.540 回答