Las llamadas al sistema no se manejan como llamadas a funciones regulares. Se necesita un código especial para hacer la transición del espacio del usuario al espacio del núcleo, básicamente un poco de código de ensamblaje en línea inyectado en su programa en el sitio de la llamada. El código del lado del kernel que "atrapa" la llamada del sistema también es algo de bajo nivel que probablemente no necesite comprender profundamente, al menos al principio.
En include/linux/syscalls.h
debajo de su directorio de origen del núcleo, encontrará esto:
asmlinkage long sys_mkdir(const char __user *pathname, int mode);
Luego en /usr/include/asm*/unistd.h
, encuentras esto:
#define __NR_mkdir 83
__SYSCALL(__NR_mkdir, sys_mkdir)
Este código dice que mkdir(2)
es la llamada al sistema # 83. Es decir, las llamadas al sistema se llaman por número, no por dirección como con una llamada de función normal dentro de su propio programa o a una función en una biblioteca vinculada a su programa. El código de cola de ensamblaje en línea que mencioné anteriormente usa esto para hacer la transición del usuario al espacio del núcleo, tomando sus parámetros junto con él.
Otra evidencia de que las cosas son un poco raras aquí es que no siempre hay una lista estricta de parámetros para las llamadas al sistema: open(2)
por ejemplo, puede tomar 2 o 3 parámetros. Eso significa que open(2)
está sobrecargado , una característica de C ++, no C, pero la interfaz syscall es compatible con C. (Esto no es lo mismo que la función varargs de C , que permite que una sola función tome un número variable de argumentos).
Para responder a su primera pregunta, no existe un archivo único donde mkdir()
exista. Linux admite muchos sistemas de archivos diferentes y cada uno tiene su propia implementación de la operación "mkdir". La capa de abstracción que permite que el núcleo oculte todo eso detrás de una sola llamada al sistema se llama VFS . Entonces, probablemente quieras comenzar a cavar fs/namei.c
, con vfs_mkdir()
. Las implementaciones reales del código de modificación del sistema de archivos de bajo nivel están en otra parte. Por ejemplo, se llama a la implementación ext4 ext4_mkdir()
, definida en fs/ext4/namei.c
.
En cuanto a su segunda pregunta, sí, hay patrones para todo esto, pero no hay una sola regla. Lo que realmente necesita es una comprensión bastante amplia de cómo funciona el núcleo para averiguar dónde debe buscar cualquier llamada de sistema en particular. No todas las llamadas al sistema involucran el VFS, por lo que sus cadenas de llamadas del lado del kernel no comienzan todas fs/namei.c
. mmap(2)
, por ejemplo, comienza en mm/mmap.c
, porque es parte del subsistema de gestión de memoria ("mm") del núcleo.
Le recomiendo que obtenga una copia de " Comprender el kernel de Linux " de Bovet y Cesati.