gpt4 book ai didi

c - 为什么 Linux 系统调用返回类型 "long"?

转载 作者:IT王子 更新时间:2023-10-28 23:54:35 24 4
gpt4 key购买 nike

我正在阅读 Linux 内核开发,第 3 版,以了解内核实现和设计。第 5 章是关于系统调用的。作者展示了一个使用 SYSCALL_DEFINE0 宏定义的系统调用声明示例,在该特定示例中扩展为:

asmlinkage long sys_getpid(void)

他进一步说:

[...] For compatibility between 32- and 64-bit systems, system calls defined to return an int in user-space return a long in the kernel.

他没有比这更深入,我无法完全理解为什么会这样。为什么long的使用与32位和64位系统有关?为什么我们不能返回一个普通的 int

最佳答案

因为很多64 bits通用 GCC 编译器的机器(例如 x86-64)sizeof(int)==4但是sizeof(void*)==8 && sizeof(long)==8 ;这称为 I32LP64(或简称 LP64)data model

例如,在Linux/x86-64系统上编译运行如下程序:

#include<stdio.h>
#include<stdint.h>
int main ()
{
printf ("sizeof(int)=%d\n", (int) sizeof (int));
printf ("sizeof(intptr_t)=%d\n", (int) sizeof (intptr_t));
printf ("sizeof(short)=%d\n", (int) sizeof (short));
printf ("sizeof(long)=%d\n", (int) sizeof (long));
printf ("sizeof(long long)=%d\n", (int) sizeof (long long));
printf ("sizeof(void*)=%d\n", (int) sizeof (void *));
return 0;
}

在我的系统上用 gcc -Wall s.c -o s 编译后正在运行 ./s在我的 Debian/Sid/x86-64(i3770k 处理器,GCC 4.8 .2)上:

sizeof(int)=4
sizeof(intptr_t)=8
sizeof(short)=2
sizeof(long)=8
sizeof(long long)=8
sizeof(void*)=8

使用 gcc -m32 -Wall s.c -o s32 在 32 位模式下编译后正在运行 ./s32 :

sizeof(int)=4
sizeof(intptr_t)=4
sizeof(short)=2
sizeof(long)=4
sizeof(long long)=8
sizeof(void*)=4

如果使用 gcc -mx32 -O3 -Wall s.c -o sx32 为 x32 编译,我得到相同的输出!

顺便说一句,也许更好的问题是为什么不使用 intptr_t ....我不知道(可能是习惯问题;when Linus 首先开始编写他的内核,C99 标准 - 定义 <stdint.h>intptr_t - 尚不存在)。

阅读更多关于 ABIs 的信息,特别是仔细阅读 X86-64 ABI (另见 x32 ABI ...)和 x86 calling conventions 上的维基页面.

关于c - 为什么 Linux 系统调用返回类型 "long"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com