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


Estudio el Kernel de Linux y descubrí que para la arquitectura x86_64 la interrupción int 0x80 no funciona como una llamada al 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 núcleo 3.4

Author: Alex, 2012-10-09

4 answers

  • 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 mayor frecuencia para invocar llamadas al sistema en modos de operación de 32 bits. Es similar a syscall, aunque 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.

Forma preferible de invocar un sistema call es usar VDSO, una parte de la memoria asignada en cada espacio de direcciones de 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 encarga de las instrucciones syscall o sysenter más difíciles, en comparación con el modo heredado int 0x80.

También, ver thisand this.

 63
Author: Paweł Dziepak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-09 19:48:25

Mi respuesta aquí cubre tu pregunta.

En la práctica, los núcleos recientes están implementando un VDSO, especialmente para optimizar dinámicamente las llamadas al sistema (el núcleo establece el VDSO en algún código mejor para el procesador actual). Así que deberías usar el VDSO, y usarás mejor, para llamadas de sistema existentes, la interfaz proporcionada por el libc.

Observe 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 algunos syscalls (probablemente gettimeofday, getpid ...) el VDSO podría evitar incluso eso (y técnicamente podría evitar hacer una llamada de sistema real). Para la mayoría de syscalls (como open, read, send, mmap ....) el coste del núcleo de la llamada de sistema es lo suficientemente grande como para hacer que cualquier mejora de la transición del espacio de usuario al espacio del núcleo (por ejemplo, usando SYSENTER o SYSCALL instrucciones de máquina en lugar de INT) sea insignificante.

 18
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:40

Tenga cuidado con esto antes de cambiar : los números de llamada al sistema difieren cuando se hace 0x80 o syscall, por ejemplo, sys_write es 4 con 0x80 y 1 con syscall.

Http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html para 32 bits o 0x80 http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64 {[6] } para syscall

 5
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 20:06:32

int 0x80 es una mejor terminología para indicar su llamada al sistema al núcleo 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 ES: par de registro DX,
  • 13h interno es el manejador del disco duro del BIOS.
  • int 10h es el EGA / VGA pantalla.
  • int 09h es el controlador de teclado.

El tema común aquí es este, cuando se invoca una interrupt/syscall, el núcleo comprueba el estado de los registros para ver qué tipo de llamada al sistema se requiere. Mirando por ejemplo, eax register, por ejemplo, y determinar qué realizar, internamente el contexto cambia al espacio del kernel, lleva a cabo el procedimiento y el contexto cambia de nuevo al espacio de usuario, con una opción para devolver los resultados de la llamada, es decir, fue tuvo éxito o fracasó.

 -3
Author: t0mm13b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-09 19:11:03