【问题标题】:Where are System Call IDs defined for x86 arch in Linux Kernel 5.0.1?Linux Kernel 5.0.1 中为 x86 架构定义的系统调用 ID 在哪里?
【发布时间】:2019-08-05 12:16:42
【问题描述】:

我正在关注 Linux 系统编程视频教程。

当我到达“如何添加自己的 Linux 系统调用”部分时,讲师显示所有系统调用 ID(以 __NR 开头的宏)都存在于 arch/x86/include/asm/unistd_32.h 或 unistd_64.h (取决于目标)。

但是在我的源代码(linux-5.0.1)中我没有看到这些文件,只有一个 unistd.h 不包含系统调用 ID。这些文件是移到别处还是 x86 现在没有自己的系统调用表。

编辑:我从 kernel.org 下载了最新的内核源代码,我正在尝试修改它。我在上述位置找不到 unistd_32.h 和 unistd_64.h 文件。我需要先做点什么吗?

【问题讨论】:

    标签: linux linux-kernel x86 system-calls systems-programming


    【解决方案1】:

    Arch Linux 在/usr/include/asm/ 中提供unistd_32.hunistd_64.h。只需查看这些标头,除非您正在修改内核以添加新的系统调用。

    <asm/unistd.h> 检查宏以确定其是否包含在 32 位或 64 位代码中(并检查 x32),并使用 #include 为目标提取正确的定义集。

    在我最新的 x86-64 Arch 系统上:

    $ pacman -Fo /usr/include/asm/unistd*
    usr/include/asm/unistd_32.h is owned by core/linux-api-headers 4.7-1
    usr/include/asm/unistd_64.h is owned by core/linux-api-headers 4.7-1
    usr/include/asm/unistd.h is owned by core/linux-api-headers 4.7-1
    usr/include/asm/unistd_x32.h is owned by core/linux-api-headers 4.7-1
    

    在内核源代码本身中,从版本 3.3 开始,供用户空间使用的 unistd_32.h由其他文件构建

    https://github.com/torvalds/linux/search?q=unistd_32.h&unscoped_q=unistd_32.harch/x86/entry/syscalls/Makefile 中找到这个

    $(uapi)/unistd_32.h: $(syscall32) $(syshdr)
        $(call if_changed,syshdr)
    

    系统调用表定义在:arch/x86/entry/syscalls/syscall_32.tbl.../syscall_64.tbl

    https://github.com/torvalds/linux/tree/6f0d349d922ba44e4348a17a78ea51b7135965b1/arch/x86/entry/syscalls

    syscall_32.tbl 的内容如下:

    # some comments
    0   i386    restart_syscall     sys_restart_syscall     __ia32_sys_restart_syscall
    1   i386    exit            sys_exit            __ia32_sys_exit
    2   i386    fork            sys_fork            __ia32_sys_fork
    3   i386    read            sys_read            __ia32_sys_read
    ...
    

    【讨论】:

    • 我从 kernel.org 下载了最新的内核源代码,我正在尝试修改它。我在上述位置找不到 unistd_32.h 和 unistd_64.h 文件。我需要先做点什么吗?
    • @ShaikMuhammadYahiya:你不要修改它们,你修改 syscall_32.tbl 和 64.tbl,然后运行 ​​make生成用户空间标题。就像我的回答说的那样,它们不是直接 source 内核的一部分。
    • @ShaikMuhammadYahiya 您的教程可能使用的是 3.3 之前的某个版本的 Linux。实际上,在这些版本中,unistd_32.hunistd_64.h 确实存在于您在问题中指定的目录中。如果您想按照教程进行操作,可以下载 v3.2。
    • @HadiBrais 是的,你是对的,导师有 Linux-2.6.32.7。但是我想用最新的 Linux 内核进行更新,对吧?你有什么建议,我做?
    • @HadiBrais:关于使用古老内核版本的 IDK。是的,可能还会有其他差异,每个差异都是可能的绊脚石,但最终目标是了解当前 Linux 的方法,而不是给自己 9 年的时间来追赶。 (虽然一旦你了解了一些基础知识,这个特定的问答对我来说是微不足道的。将它视为 Makefile 中的目标告诉我它是由其他东西构建的,而不是正确的源文件本身。)如果有任何更新的教程,找到一个可能是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2012-12-12
    • 1970-01-01
    • 2012-12-30
    • 2013-07-13
    • 2021-05-11
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多