GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué es mejor int 0x80 o syscall en código de 32 bits en Linux?

  • 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 utilizada con mayor frecuencia para invocar llamadas al sistema en modos de operación de 32 bits. Es similar a syscall , aunque es 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 preferida de invocar una llamada al sistema es usar vDSO, una parte de la memoria mapeada 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 ocupa de las más difíciles, en comparación con el int 0x80 heredado. forma, manejo de syscall o sysenter instrucciones.

Además, vea esto y esto.


Mi respuesta aquí cubre su pregunta.

En la práctica, los núcleos recientes están implementando un VDSO, en particular para optimizar dinámicamente las llamadas al sistema (el núcleo establece el VDSO en el mejor código para el procesador actual). Por lo tanto, debe usar el VDSO, y será mejor que use, para las llamadas al sistema existentes, la interfaz proporcionada por la libc.

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


Tenga cuidado con esto antes de cambiar:los números de llamada del sistema difieren al hacer 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 0x80http://blog.rchapman.org/post/36801038863/linux-system-call-table-for -x86-64 para llamada al sistema


Linux
  1. ¿Cómo cargar módulos del kernel de Linux desde el código C?

  2. Espacio de direcciones del proceso de 32 bits en Linux de 64 bits

  3. ¿Qué significa __init en el código del kernel de Linux?

  4. ¿Qué significa EXPORT_SYMBOL en el código del kernel de Linux?

  5. ¿Cómo codificar un módulo del kernel de Linux?

Qué hacer en caso de pánico en el kernel de Linux

Limitación del acceso al sistema para una aplicación de Linux

¿Qué significa decir que el kernel de Linux es preventivo?

¿Cuál es la fuente actual del kernel de Linux?

Compilando GNU/Linux con optimización -O3

¿Qué es un kernel contaminado en Linux?