syscalls syscall sys_write open creat c linux linux-kernel system-calls

sys_write - syscall 4



¿Qué es mejor "int 0x80" o "syscall"? (4)

Estudio el kernel de Linux y descubrí que para la arquitectura x86_64 la interrupción int 0x80 no funciona como llamar a la llamada del sistema.

La pregunta es: en el caso de la arquitectura x86 , ¿qué es más preferible syscall o int 0x80 y por qué?

EDITAR : uso el kernel 3.4


int 0x80 es una mejor terminología para indicar que es una llamada al kernel del sistema para decirle que haga algo.

El significado y la interpretación son intercambiables, ''make a syscall'' o ''issue int 80h''.

No es diferente a los días de DOS:

  • invoque int 21h para que DOS haga algo depedning en el registro AX y, opcionalmente, el par de registros ES: DX,
  • int 13h es el controlador del disco duro del BIOS.
  • int 10h es la pantalla EGA / VGA.
  • int 09h es el controlador de teclado.

El tema común aquí es esto, cuando se invoca una interrupción / syscall, el kernel verifica el estado de los registros para ver qué tipo de llamada al sistema se requiere. Al observar, por ejemplo, el registro de eax , por ejemplo, y determinar qué realizar, el contexto interno cambia al espacio del kernel, lleva a cabo el procedimiento y el cambio de contexto al espacio de usuario, con la opción de devolver los resultados de la llamada. es decir, si tuvo éxito o fue un fracaso.


  • syscall es la forma predeterminada de ingresar al modo kernel en x86-64 . Esta instrucción no está disponible en modos de operación de 32 bits en procesadores Intel .
  • sysenter es una instrucción que se usa con más frecuencia para invocar llamadas al sistema en modos de operación de 32 bits. Es similar a syscall , syscall un poco más difícil de usar, pero esa es la preocupación del kernel.
  • int 0x80 es una forma heredada de invocar una llamada al sistema y debe evitarse.

La forma preferible de invocar una llamada al sistema es usar VDSO, una parte de la memoria asignada en cada espacio de direcciones del proceso que permite usar las llamadas al sistema de manera más eficiente (por ejemplo, al no ingresar al modo kernel en algunos casos). VDSO también se ocupa de más difícil, en comparación con el legacy int 0x80 way, el manejo de las instrucciones syscall o sysenter .

Además, mira esto y esto .



Mi respuesta aquí cubre tu pregunta.

En la práctica, los kernels recientes están implementando un VDSO , especialmente para optimizar dinámicamente las llamadas al sistema (el kernel establece el VDSO a algún código mejor para el procesador actual). Por lo tanto, debe usar VDSO, y será mejor utilizar, para las llamadas de sistema existentes, la interfaz proporcionada por la libc.

Tenga en cuenta que, AFAIK, una parte significativa del costo de las llamadas de sistema simples va del espacio de usuario al núcleo y viceversa. Por lo tanto, para algunas llamadas de sistema (probablemente gettimeofday , getpid ...) el VDSO podría evitar incluso eso (y técnicamente podría evitar hacer un syscall real). Para la mayoría de las llamadas de sistema (como open , read , send , mmap ...) el costo del kernel de syscall es lo suficientemente grande como para mejorar la transición del espacio de usuario al espacio del núcleo (por ejemplo, usando SYSENTER o instrucciones de la máquina de SYSCALL lugar de INT ) insignificante.