簡體   English   中英

在linux內核上尋找系統調用實現

[英]Looking for system calls implementation on linux kernel

我正在尋找open()close()write()unlink() ,但我無法在任何地方找到它們! 我覺得每個功能就像sys_opendo_openetc_open ......但沒有與我們使用的接口。 你能幫助我嗎?

我需要發現他們做了什么樣的安全檢查

如果你的意思是像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 :-)

您需要在內核源代碼中查找SYSCALL_DEFINE宏。 例如,在/fsunlink以獲取以下內容:

$ 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之后的數字是syscall參數計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM