【问题标题】:Where is the system call table in linux kernel?linux内核中的系统调用表在哪里?
【发布时间】:2013-07-13 05:13:58
【问题描述】:

我正在阅读 Robert Love 的 Linux Kernel Development,他所做的练习之一是创建系统调用(第 106 页)。问题是我无法在 v3.9 中找到 x86_32 架构的系统调用表文件。我知道他使用的是 2.6.xx 版本,但我不知道该版本是否适用于我正在使用的发行版,因为它已经很旧了,所以我更喜欢 v3.9。

更多信息: 我所说的练习如下: 在系统调用表的末尾添加一个条目。这需要为每个支持系统调用的架构(对于大多数调用,是所有的架构)完成。系统调用在表中的位置,从零开始, 是它的系统调用号。例如,列表中的第十个条目分配给系统调用号 9。

使用以下方法解决: 对于 x86 架构,系统调用表位于 arch/x86/syscalls/syscall_32.tbl 中。感谢 Sudip Mukherjee 的帮助。

另一种方法如下: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008598.html 也感谢 Srinivas Ganji 的帮助。

【问题讨论】:

  • 你在哪里搜索的?
  • 在书中它说它位于 entry.S 但据我所知,这已在最新版本中进行了更改。所以我在 arch/x86/kernel 中搜索了 entry_32.S 文件,但我也没有找到那里的表
  • 好像是here
  • 似乎在内核 v3.0 中,该表位于一个名为 syscall_table_32.S 的文件中,但我在 v3.9 中找不到它。来源:emntech.com/docs/syscall_emntech.pdf

标签: linux kernel


【解决方案1】:

从 linux kernel 4.2 开始,系统调用表已从 arch/x86/syscalls/syscall_64.tbl 移至 arch/x86/entry/syscalls/syscall_64.tbl

这里是对应的commit

commit 1f57d5d85ba7f1f467173ff33f51d01a91f9aaf1
Author: Ingo Molnar <mingo@kernel.org>
Date:   Wed Jun 3 18:36:41 2015 +0200

    x86/asm/entry: Move the arch/x86/syscalls/ definitions to arch/x86/entry/syscalls/

    The build time generated syscall definitions are entry code related, move
    them into the arch/x86/entry/ directory.

【讨论】:

    【解决方案2】:

    在src根目录下创建一个testing文件夹:src/linux-3.4/testing/,然后放到这个文件夹里面:
    - 包含系统调用代码的文件:strcpy.c

    #include <linux/linkage.h>
    #include <linux/kernel.h>
    asmlinkage long sys_strcpy(char *dest, char *src)
    {
        int i=0;
        while(src[i]!='\0') {
            dest[i]=src[i++];
        }
        dest[i]='\0';
        printk(" Done it ");
        return 0;
    }
    

    以及只包含以下行的 Makefile:

    obj-y:=strcpy.o
    

    向系统调用表和函数原型添加一个条目:
    - 编辑文件src/linux-3.4/arch/x86/syscalls/syscall_32.tbl,将此行添加到免费的条目223

     223        i386    strcpy          sys_strcpy
    

    通过添加函数原型编辑文件src/linux-3.4/include/linux/syscalls.h

    asmlinkage long sys_strcpy(char *dest, char *src);
    

    通过添加之前创建的测试文件夹来编辑 src 根目录 (src/linux-3.4/Makefile) 中的主 Makefile,如下所示:

    core-y      += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ testing/
    

    【讨论】:

      【解决方案3】:

      对于启用审计的系统,系统调用表可以通过以下方式轻松检索:

      ausyscall --dump
      

      例如:

      $ ausyscall --dump
      
      Using x86_64 syscall table:
      0   read
      1   write
      2   open
      3   close
      4   stat
      5   fstat
      6   lstat
      7   poll
      8   lseek
      9   mmap
      10  mprotect
      ...SNIP...
      

      【讨论】:

        【解决方案4】:

        关于 SO 的类似问题,OP 似乎已经解决了它:

        New syscall not found (linux kernel 3.0.0) where should I start looking?

        文件似乎是arch/x86/kernel/syscall_table_32.c

        【讨论】:

          猜你喜欢
          • 2014-01-27
          • 2011-04-29
          • 2020-04-04
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多