syscall
es la forma predeterminada de ingresar al modo kernel enx86-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 asyscall
, 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