【问题标题】:Where can I find system call source code?在哪里可以找到系统调用源代码?
【发布时间】:2012-04-26 08:04:35
【问题描述】:

在 Linux 中,如果我有源代码树,我在哪里可以找到所有系统调用的源代码?另外,如果我想查找特定系统调用的源代码和程序集,是否可以在终端中键入诸如 my_system_call 之类的内容?

【问题讨论】:

    标签: c linux assembly linux-kernel system-calls


    【解决方案1】:

    我知道它很旧,但我也在搜索_system_call() 的来源并找到了这个花絮

    system_call 入口点的实际代码可以在 /usr/src/linux/kernel/sys_call.S 中找到许多系统调用的实际代码可以在 /usr/src/linux/kernel/sys.c 中找到,其余的都在其他地方找到。 find是你的朋友。

    我认为这是过时的,因为我什至没有那个文件。但是,grep 在 arch/x86/kernel/entry_64.S 中找到了ENTRY(system_call),并且似乎是调用各个系统调用的东西。我现在不了解我的 intel-syntax x86 asm,所以你必须看看这是否是你想要的。

    【讨论】:

    • entry_64.S 在主线 4.8 中不再存在。
    【解决方案2】:

    从应用程序的角度来看,system call 是由kernel 完成的基本原子操作。

    Assembly Howto 根据机器指令解释正在发生的事情。

    当然,内核在处理系统调用时会做很多事情。

    实际上,您几乎可以相信整个内核代码都专门用于处理所有系统调用(这并不完全正确,但几乎是这样;从应用程序的角度来看,内核仅通过系统调用可见)。 Daniel Kamil Kozar 的另一个 answer 正在解释什么内核函数开始处理某些系统调用(但通常,内核的许多其他部分间接参与系统调用;例如,调度程序间接参与实现 @987654325 @ 因为它管理由成功的fork 系统调用创建的子进程)。

    【讨论】:

      【解决方案3】:

      您需要 Linux 内核源代码才能查看系统调用的实际源代码。手册页,如果安装在您的本地系统上,则仅包含调用的文档,而不包含它们的源代码本身。

      不幸的是,系统调用并不仅仅存储在整个内核树中的一个特定位置。这是因为各种系统调用可以引用系统的不同部分(进程管理、文件系统管理等),因此将它们与与系统特定部分相关的树的部分分开存储是不可行的。

      您能做的最好的事情就是寻找SYSCALL_DEFINE[0-6] 宏。它(显然)用于将给定的代码块定义为系统调用。例如,fs/ioctl.c 有以下代码:

      SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
      {
      /* do freaky ioctl stuff */
      }
      

      这样的定义意味着ioctl 系统调用被声明并接受三个参数。 SYSCALL_DEFINE 旁边的数字表示参数的数量。例如,在getpid(void) 的情况下,在kernel/timer.c 中声明,我们有以下代码:

      SYSCALL_DEFINE0(getpid)
      {
              return task_tgid_vnr(current);
      }
      

      希望能把事情弄清楚一点。

      【讨论】:

        猜你喜欢
        • 2017-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2011-09-15
        • 2011-08-31
        • 1970-01-01
        相关资源
        最近更新 更多