在寻找Linux内核上的系统调用实现

8
我正在寻找open()close()write()unlink()的实现,但是我无法在任何地方找到它们!我找到的每个函数都像sys_opendo_openetc_open,但没有使用的接口。你能帮我吗?
我需要发现它们进行了哪些安全检查。
2个回答

7
如果你指的是类似于fcntl.h中所找到的库调用,它们不是内核的一部分,而是glibc的一部分。
如果你指的是实际的内核调用,系统调用xyzzy通常由函数sys_xyzzy处理。
至少在2.4版本中,entry.S文件保存了一个将系统调用号映射到函数的表格(我没有查看更高版本的内核)。
.data
  ENTRY(sys_call_table)
      .long SYMBOL_NAME(sys_ni_syscall)       /* 0  -  old "setup()" system call*/
      .long SYMBOL_NAME(sys_exit)
      .long SYMBOL_NAME(sys_fork)
      .long SYMBOL_NAME(sys_read)
      .long SYMBOL_NAME(sys_write)
      .long SYMBOL_NAME(sys_open)             /* 5 */
      .long SYMBOL_NAME(sys_close)
      .long SYMBOL_NAME(sys_waitpid)
      .long SYMBOL_NAME(sys_creat)
      .long SYMBOL_NAME(sys_link)
      .long SYMBOL_NAME(sys_unlink)           /* 10 */
      .long SYMBOL_NAME(sys_execve)
      .long SYMBOL_NAME(sys_chdir)
      .long SYMBOL_NAME(sys_time)
      .long SYMBOL_NAME(sys_mknod)
      .long SYMBOL_NAME(sys_chmod)            /* 15 */
        :
      .long SYMBOL_NAME(sys_ni_syscall)       /* sys_remap_file_pages */
      .long SYMBOL_NAME(sys_ni_syscall)       /* sys_set_tid_address */

KernelGrok 网站似乎有一张很有用的页面,展示了系统调用的名称、参数以及其源代码位置。例如(稍作格式化):

  0   sys_restart_syscall
      eax = 0x00
      kernel/signal.c:2058
  1   sys_exit
      eax = 0x01
      ebx = int error_code
      kernel/exit.c:1046
  2   sys_fork
      eax = 0x02
      ebx = struct pt_regs *
      arch/alpha/kernel/entry.S:716
  3   sys_read
      eax = 0x03
      ebx = unsigned int fd
      ecx = char __user *buf
      edx = size_t count
      fs/read_write.c:391
  4   sys_write
      eax = 0x04
      ebx = unsigned int fd
      ecx = const char __user *buf
      edx = size_t count
      fs/read_write.c:408
  :

等等等等。但是,作为老派人士,我更喜欢将内核源代码保存在本地,然后只使用grep命令来搜索 :-)


6
您需要在内核源代码中寻找SYSCALL_DEFINE宏。例如,在/fs目录下搜索unlink,可以得到以下结果:$ grep -r -n SYSCALL_DEFINE *.c | grep unlink
namei.c:2811:SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag)
namei.c:2822:SYSCALL_DEFINE1(unlink, const char __user *, pathname)

请注意,SYSCALL_DEFINE后面的数字是系统调用参数计数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接