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

Adr*_*ano 8 c linux kernel linux-kernel

我在寻找的实现open(),close(),write()unlink(),但我不能在任何地方找到他们!我觉得每一个功能是像sys_open,do_open,etc_open...但没有与我们使用的接口.你能帮助我吗?

我需要发现他们做了什么样的安全检查

pax*_*blo 7

如果你的意思是库中调用的那些fcntl.h,它们不是内核的一部分,它们就是其中的一部分glibc.

如果你指实际的内核调用,系统调用xyzzy通常是由函数处理sys_xyzzy.

entry.S中的文件,至少在2.4(我没有看过以后的内核),举行了表映射系统调用号到功能:

.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 */
Run Code Online (Sandbox Code Playgroud)

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
  :
Run Code Online (Sandbox Code Playgroud)

等等.但是,作为老派,我更喜欢将内核源代码保留在本地并且只使用grep:-)


Ily*_*kov 6

您需要SYSCALL_DEFINE在内核源代码中查找宏.例如,grepping为unlink/fs给出如下:

$ 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)
Run Code Online (Sandbox Code Playgroud)

请注意,后面的数字SYSCALL_DEFINE是syscall参数计数.