una solicita sistema reglas operativo miscelanea manejo llamadas llamada interfaz como calls c linux linux-kernel kernel

solicita - Buscando la implementación de llamadas al sistema en Linux kernel



miscelanea de llamadas al sistema (2)

Si te refieres a las llamadas a la biblioteca como las que se encuentran en fcntl.h , no son parte del núcleo, son parte de glibc .

Si se refiere a las llamadas reales al kernel, la llamada al sistema xyzzy generalmente es manejada por la función sys_xyzzy .

El archivo entry.S , al menos en 2.4 (no he examinado kernels posteriores), contenía una tabla de asignación de números de llamadas del sistema para funciones:

.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 parece tener una página útil que muestra las llamadas al sistema, sus nombres, parámetros y dónde encontrar la fuente. Por ejemplo (ligeramente reformateado):

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 :

y así. Pero, como soy de la vieja escuela, prefiero mantener fuentes kernel locales y solo usar grep :-)

Estoy buscando las implementaciones de open() , close() , write() y unlink() , ¡pero no puedo encontrarlas en ningún lado! Cada función que encuentro es como sys_open , do_open , etc_open ... pero nada con la interfaz que usamos. ¿Me puedes ayudar?

Necesito descubrir qué tipo de controles de seguridad hacen


SYSCALL_DEFINE buscar la macro SYSCALL_DEFINE en las fuentes del kernel. Por ejemplo, grepping para unlink a /fs da lo siguiente:

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

Tenga en cuenta que el número después de SYSCALL_DEFINE es el recuento de argumentos syscall.