Ищем реализацию системных вызовов в ядре Linux - PullRequest
8 голосов
/ 20 февраля 2012

Я ищу реализации open(), close(), write() и unlink(), но я нигде не могу их найти! Каждая функция, которую я нахожу, похожа на sys_open, do_open, etc_open ... но ничего с интерфейсом, который мы используем. Вы можете мне помочь?

Мне нужно выяснить, какие проверки безопасности они проводят

Ответы [ 2 ]

7 голосов
/ 20 февраля 2012

Если вы имеете в виду вызовы из библиотеки , подобные тем, которые были найдены в 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: -)

6 голосов
/ 20 февраля 2012

Вам нужно искать макрос SYSCALL_DEFINE в исходниках ядра.Например, поиск значения 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)

Обратите внимание, что число после SYSCALL_DEFINE является количеством аргументов системного вызова.

...