哪个系统调用号头文件是正确的? [英] Which header file of system call numbers is correct?

查看:24
本文介绍了哪个系统调用号头文件是正确的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近在做一些内核编码,我发现了2个unistd.h文件。

第一个位置为/usr/include/asm/unistd.h。第二个来自内核的源代码:linux/include/uapi/asm-generic/unistd.h。 源代码的版本与我的内核的版本相同,但两个头文件 彼此不同。

/usr/include/asm/unistd.h(从我的电脑):

#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
#define __NR_poll 7
#define __NR_lseek 8
#define __NR_mmap 9

linux/include/uapi/asm-generic/unistd.h(来源):

#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
#define __NR_io_destroy 1
__SYSCALL(__NR_io_destroy, sys_io_destroy)
#define __NR_io_submit 2
__SC_COMP(__NR_io_submit, sys_io_submit, compat_sys_io_submit)
#define __NR_io_cancel 3
__SYSCALL(__NR_io_cancel, sys_io_cancel)
#define __NR_io_getevents 4
__SC_COMP(__NR_io_getevents, sys_io_getevents, compat_sys_io_getevents)

/* fs/xattr.c */
#define __NR_setxattr 5
__SYSCALL(__NR_setxattr, sys_setxattr)
#define __NR_lsetxattr 6
__SYSCALL(__NR_lsetxattr, sys_lsetxattr)
#define __NR_fsetxattr 7
__SYSCALL(__NR_fsetxattr, sys_fsetxattr)
#define __NR_getxattr 8
__SYSCALL(__NR_getxattr, sys_getxattr)
#define __NR_lgetxattr 9

有什么不同?我应该使用哪一个来索引sys_call_table

推荐答案

asm-generic是一个模板版本,如果您正在为内核开发新的架构,则可以使用该模板版本。我相信您会发现,内核源代码中实际上有许多版本的unistd.h,因为系统调用的顺序(以及系统调用的存在)因体系结构而异。尝试从您的内核源层次结构的根目录开始:

find . -name 'unistd*.h'

特别是对于x86,uapi版本是在构建内核时生成的。查看arch/x86/entry/syscalls/目录中的Makefile和各种*.tbl文件。这最终会生成文件:

arch/x86/include/generated/uapi/asm/unistd_64.h
arch/x86/include/generated/uapi/asm/unistd_32.h
arch/x86/include/generated/uapi/asm/unistd_x32.h

(都是#include%d来自存根unistd.h文件)。

最终,Linux"发行版"的创建是非常特定于体系结构的,因此由发行版创建者将正确的unistd.h文件复制到/usr/include层次结构中的某个适当位置。(当然,您的libc还需要针对正确的版本进行编译,才能使普通的libc系统调用正常工作。)

总而言之,/usr/include/asm中的版本最好匹配您正在运行的内核,否则不可能从系统上的用户进程正确地生成特殊系统调用,但您不应该在内核源代码层次结构中使用该系统调用,因为内核源代码层次结构绝对不依赖于用户空间标头。在内核源代码中,索引该表的机制依赖于体系结构,因为表的布局和排序本身依赖于体系结构,并且只有体系结构特定的代码(系统调用条目代码)才能正常访问表,因此只有该代码"需要知道"正确的索引。

现在,如果您要创建新的系统调用,则需要在所有unistd.h文件中为您希望它出现的所有体系结构定义其编号。

这篇关于哪个系统调用号头文件是正确的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆