usuario una son solicita sistema seguridad operativo modo llamadas llamada las interfaz funciona como c linux-kernel kernel system-calls

c - una - llamadas al sistema linux



Implementación de llamadas/trampas del sistema dentro del kernel de Linux fuente (3)

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.

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 alguien pregunte, sí, esto es tarea.

Como nota, estoy usando Github para navegar por el código fuente del kernel, ya que kernel.org está inactivo: https://github.com/torvalds/linux/


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

Cada llamada al sistema utiliza una trampa (interrupción 0x80 si recuerdo correctamente) por lo que el bit "kernel" se activará en PSW, y las operaciones privilegiadas estarán disponibles para el procesador.

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

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

Use lxr (como el comentario anterior ya se ha mencionado) en general para navegar por el código fuente.

De todos modos, la función se implementa utilizando SYSCALL_DEFINE1 u otras versiones de la macro, consulte http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c


Para la arquitectura x86, la interrupción SYCALL_VECTOR (0x80) se usa solo para kernels 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 manejador de trampa definido en entry_32.S :

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

Para los kernels de 64 bits , las nuevas instrucciones SYSENTER (Intel) o SYSCALL (AMD) se utilizan por motivos 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 el perspetivo de espacio de usuario, es posible que desee echar un vistazo a esta página (un poco obsoleta para los nombres de funciones / archivos).


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

De todos modos, si entiendo bien 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