【问题标题】:Looking for system calls implementation on linux kernel寻找linux内核上的系统调用实现
【发布时间】:2012-02-20 01:22:41
【问题描述】:

我正在寻找open()close()write()unlink() 的实现,但我在任何地方都找不到它们!我发现的每个函数都类似于sys_opendo_openetc_open... 但我们使用的界面却没有。你能帮帮我吗?

我需要了解他们进行了哪些安全检查

【问题讨论】:

    标签: c linux linux-kernel kernel


    【解决方案1】:

    您需要在内核源代码中查找SYSCALL_DEFINE 宏。例如,在 /fs 处对 unlink 进行 grepping 会得到以下结果:

    $ 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 后面的数字是系统调用参数计数。

    【讨论】:

      【解决方案2】:

      如果您指的是 library 调用,例如 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 */
      

      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 :-)

      【讨论】:

        猜你喜欢
        • 2011-11-16
        • 1970-01-01
        • 2010-09-20
        • 2016-05-25
        • 2012-01-14
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多