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


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

Author: Dr.Knowitall, 2012-04-14

3 answers

Necesitará las fuentes del núcleo 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 particular en todo el árbol del núcleo. Esto se debe a que varias llamadas al sistema pueden referirse a diferentes partes del sistema (gestión de procesos, gestión del sistema de archivos, etc.).) y por lo tanto sería no es posible almacenarlos aparte de la parte del árbol relacionada con esa parte particular del sistema.

Lo mejor que puedes hacer es buscar la macro SYSCALL_DEFINE[0-6]. Se utiliza (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 el ioctl syscall se declara y toma tres argumentos. El número junto a SYSCALL_DEFINE significa el número 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 eso aclare un poco las cosas.

 31
Author: Daniel Kamil Kozar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-14 00:07:14

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

El Como de montaje explica lo que está sucediendo, en términos de instrucción de la máquina.

Por supuesto, el núcleo está haciendo muchas cosas al manejar una llamada de sistema.

En realidad, casi se podría creer que todo el código del núcleo 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 de vista, el núcleo solo es visible a través de llamadas al sistema). La otra respuesta de Daniel Kamil Kozar está explicando qué función del núcleo está iniciando el manejo de alguna llamada al sistema (pero muy a menudo, muchas otras partes del núcleo participan indirectamente en las llamadas al sistema; por ejemplo, el programador participa indirectamente en la implementación de fork porque administra el proceso hijo creado por una llamada al sistema fork exitosa).

 2
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:01

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

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 resto se encuentran en otra parte. encontrar es tu amigo.

Asumo 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 el lo que llama a las llamadas individuales del sistema. No estoy en mi intel-syntax x86 asm en este momento, así que tendrá que mirar y ver si esto es lo que quería.

 2
Author: KitsuneYMG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 14:50:20