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

3 minutos de lectura

avatar de usuario
Dr. Sabiduría

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

Necesitará las fuentes del kernel de Linux para ver la fuente 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 hacer referencia a diferentes partes del sistema (gestión de procesos, gestión del sistema de archivos, etc.) y, por lo tanto, sería inviable almacenarlas aparte de la parte del árbol relacionada con esa parte particular del sistema.

Lo mejor que puedes hacer es buscar el SYSCALL_DEFINE[0-6] macro. 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 el ioctl syscall se declara y toma tres argumentos. El número al lado del SYSCALL_DEFINE significa el número de argumentos. Por ejemplo, en el caso de getpid(void)declarado en kernel/timer.ctenemos el siguiente código:

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

Espero que aclare las cosas un poco.

avatar de usuario
Basile Starynkevitch

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.

los Instrucciones de montaje explica lo que está sucediendo, en términos de instrucción de máquina.

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

En realidad, casi podrías creer que todo el código del 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 inicia el manejo de alguna llamada al sistema (pero muy a menudo, muchas otras partes del kernel participan indirectamente en las llamadas al sistema; por ejemplo, el programador participa indirectamente en la implementación fork porque gestiona el proceso hijo creado por un éxito fork llamada al sistema).

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

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 otros lugares. encontrar 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 día con mi intel-syntax x86 asm en este momento, así que tendrás que mirar y ver si esto es lo que querías.

  • entry_64.S ya no existe en la línea principal 4.8.

    – sherrellbc

    28 de diciembre de 2016 a las 20:07

  • @sherrellbc Estás equivocado entry_64.S todavía está presente hasta el día de hoy aquí está el código fuente https://elixir.bootlin.com/linux/v5.16.7/source/arch/x86/entry/entry_64.S aunque estoy teniendo dificultades para encontrar dónde están presentes las funciones de llamadas al sistema.

    – KMG

    7 feb a las 22:02


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad