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.