¿Dónde puedo encontrar el código fuente de la llamada del sistema?

En Linux, ¿dónde puedo encontrar el código fuente para todas las llamadas al sistema dado que tengo el árbol de fonts? Además, si tuviera que buscar el código fuente y el ensamblaje para una llamada al sistema en particular ¿hay algo que pueda escribir en terminal como -my_system_call?

Necesitará las fonts del kernel de Linux para ver el origen real de las llamadas al sistema. Las páginas de manual, si están instaladas en su sistema local, solo contienen la documentación de las llamadas y no su fuente en sí.

Desafortunadamente para usted, las llamadas al sistema no se almacenan en una sola ubicación en el árbol kernel completo. Esto se debe a que varias llamadas al sistema pueden referirse a diferentes partes del sistema (gestión de procesos, gestión de sistemas de archivos, etc.) y, por lo tanto, sería imposible almacenarlas aparte de la parte del árbol relacionada con esa parte concreta del sistema.

Lo mejor que puede hacer es buscar la SYSCALL_DEFINE[0-6] . Se usa (obviamente) para definir el bloque de código dado como una llamada al sistema. Por ejemplo, fs/ioctl.c tiene el siguiente código:

 SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) { /* do freaky ioctl stuff */ } 

Tal definición significa que ioctl syscall se declara y toma tres argumentos. El número al lado de SYSCALL_DEFINE significa la cantidad de argumentos. Por ejemplo, en el caso de getpid(void) , declarado en kernel/timer.c , tenemos el siguiente código:

 SYSCALL_DEFINE0(getpid) { return task_tgid_vnr(current); } 

Espero que aclare un poco las cosas.

Desde el punto de vista de una aplicación, una llamada al sistema es una operación elemental y atómica realizada por el kernel .

El Assembly Howto explica lo que está sucediendo, en términos de instrucción de máquina.

Por supuesto, el kernel está haciendo muchas cosas cuando maneja un syscall.

En realidad, casi se puede creer que todo el código kernel está dedicado a manejar todas las llamadas al sistema (esto no es del todo cierto, pero casi, desde el punto de vista de las aplicaciones, el kernel solo es visible a través de las llamadas al sistema). La otra respuesta de Daniel Kamil Kozar es explicar qué función del kernel está comenzando a manejar algunas llamadas al sistema (pero muy a menudo, muchas otras partes del núcleo participan indirectamente en las llamadas al sistema, por ejemplo, el progtwigdor participa indirectamente en la implementación del fork porque gestiona el proceso hijo creado por un exitoso syscall de fork ).

Sé que es viejo, pero también estaba buscando la fuente de _system_call() y encontré este tidbit

El código real para el punto de entrada system_call se puede encontrar en /usr/src/linux/kernel/sys_call.S El código real para muchas de las llamadas al sistema se puede encontrar en /usr/src/linux/kernel/sys.c, y el rest se encuentran en otros lugares. encuentra es tu amigo

Supongo que esto está fechado, porque ni siquiera tengo ese archivo. Sin embargo, grep encontró ENTRY(system_call) en arch / x86 / kernel / entry_64.S y parece ser lo que llama a las llamadas individuales del sistema. No estoy al tanto de mi asn de intel-syntax x86 en este momento, así que tendrás que mirar y ver si esto es lo que querías.