2012-04-13 11 views

Respuesta

29

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

Lo mejor que puede hacer es buscar la macro 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 */ 
} 

Esta definición significa que la llamada al sistema ioctl se declara y tiene tres argumentos. El número al lado del SYSCALL_DEFINE significa la cantidad de argumentos. Por ejemplo, en el caso de getpid(void), declaró en kernel/timer.c, tenemos el siguiente código:

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

esperanza de que aclara las cosas un poco.

2

Desde el punto de vista de una aplicación, un system call 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 la máquina.

Por supuesto, el kernel está haciendo muchas cosas al manejar un syscall.

En realidad, casi podría creer que todo el código kernel está dedicado a manejar todas las llamadas del sistema (esto no es del todo cierto, pero casi, desde el punto de vista de las aplicaciones, el núcleo solo es visible a través de llamadas del sistema). El otro answer de Daniel Kamil Kozar explica 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 programador participa indirectamente en la implementación fork porque gestiona el proceso hijo creado por un exitoso fork syscall).

1

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

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 encuentra en otra parte. encuentra es tu amigo

Supongo que esta fecha, 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-sintaxis x86 en este momento, así que tendrás que mirar y ver si esto es lo que querías.

+0

'entry_64.S' ya no existe en la línea principal 4.8. – sherrellbc

Cuestiones relacionadas