2011-09-13 20 views
12

Actualmente estoy aprendiendo sobre los sistemas operativos, el uso de trampas para facilitar las llamadas al sistema dentro del kernel de Linux. Localice la tabla de las trampas en traps.c y la implementación de muchas de las trampas dentro de entry.S.Implementación de llamadas/trampas del sistema dentro del kernel fuente de Linux

Sin embargo, tengo instrucciones para encontrar una implementación de dos llamadas al sistema en el kernel de Linux que utilizan trampas para implementar una llamada al sistema. Aunque puedo encontrar la definición de las trampas, no estoy seguro de cómo sería una "llamada" a una de estas trampas dentro del núcleo. Por lo tanto, estoy luchando por encontrar un ejemplo de este comportamiento.

Antes de que nadie pregunte, sí, esto es tarea.

Como nota, estoy usando Github para navegar por la fuente del núcleo, ya que se ha reducido kernel.org: https://github.com/torvalds/linux/

+2

El buen tipo de tarea pregunta :) – James

+6

Usa http://lxr.linux.no/ para navegar fuente de Linux. Le ahorrará toneladas de tiempo;) – rumpel

+0

@rumpel: nunca he oído hablar de eso ... parece bastante simple. ¿Hay algo especial aquí que no esté disponible con vim + 'ctags'? –

Respuesta

0

me ha instruido para encontrar una implementación de dos llamadas al sistema en el núcleo de Linux que utilizan trampas para implementar una llamada al sistema

Cada llamada al sistema utiliza una trampa (interrupción 0x80 si no recuerdo mal) por lo que el bit de "núcleo" se encenderá en la PSW, y las operaciones privilegiadas estará disponible para el procesador .

Como mencionaste, las llamadas al sistema se especifican en entry.S bajo sys_call_table: y todas comienzan con el prefijo "sys".

se encuentra la cabecera de la función llamada al sistema en: include/linux/syscalls.h, se puede encontrar aquí: http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h

Uso LXR (como el comentario anterior ya se ha mencionado), en general, con el fin de navegar por el código fuente.

De todos modos, la función se implementan utilizando el SYSCALL_DEFINE1 o versiones othe de la macro, ver http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c

+1

También hay llamadas rápidas que no requieren una interrupción. No estoy seguro de cómo se implementan, así que tendrás que buscarlo en google, lo siento. – RedX

+0

@RedX Tiene razón en general, pero estoy bastante seguro de que las llamadas al sistema en Entry.S a continuación 'sys_call_table' se implementan con una interrupción (Después de leer brevemente el código) –

+2

@RedX Hay instrucciones SYSENTER/SYSEXIT en x86 que probablemente sea en lo que estás pensando: http://articles.manugarg.com/systemcallinlinux2_6.html – SoapBox

0

Si usted está buscando una llamada al sistema real, no una implementación de una llamada al sistema, tal vez usted quiere revisa algunas bibliotecas de C ¿Por qué un kernel incluiría una llamada al sistema? (No estoy hablando de un sistema de aplicación llamada, estoy hablando por ejemplo, una llamada real chdir por ejemplo. Hay una llamada al sistema chdir, que es una solicitud para cambiar el directorio y hay una chdirimplementación de llamadas al sistema que realmente lo cambia y debe estar en algún lugar del kernel). Ok, tal vez algunos kernels incluyen algunos syscalls también, pero esa es otra historia :)

De todos modos, si entiendo correctamente tu pregunta, no estás buscando una implementación sino una llamada real. GNU libc es demasiado complicado para mí, pero puedes intentar navegar en las fuentes de dietlibc. Algunos ejemplos:

chdir.S

syscalls.h

7

Para la arquitectura x86 la SYCALL_VECTOR (0x80) de interrupción se utilizan sólo para los núcleos de 32 bits. Puede ver el diseño del vector de interrupción en arch/x86/include/asm/irq_vectors.h.La función trap_init() de traps.c es la que establece el controlador de trampa se define en entry_32.S:

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

Para los núcleos de 64bit, el nuevo SYSENTER (Intel) o SYSCALL (AMD) CONSEJO son utilizado por razones de rendimiento. La función syscall_init() de arch/x86/kernel/cpu/common.c configura el "controlador" definido en entry_64.S y con el mismo nombre (system_call).

Para obtener información sobre el espacio de usuario, es posible que desee consultar this page (un poco desactualizado para los nombres de funciones/archivos).

Cuestiones relacionadas