¿Qué sucede si utiliza la ABI de Linux int 0x80 de 32 bits en código de 64 bits?

int 0x80 en Linux siempre invoca la ABI de 32 bits, independientemente del modo desde el que se llame: args enebx, ecx, ... y números de syscall de/usr/include/asm/unistd_32.h. (O se bloquea en núcleos de 64 bits compilados sinCONFIG_IA32_EMULATION).

El código de 64 bits debe usarsyscall, con números de llamada de/usr/include/asm/unistd_64.h, y args enrdi, rsi, etc. VerCuáles son las convenciones de llamadas para las llamadas al sistema UNIX y Linux en i386 y x86-64. Si su pregunta fue marcada como un duplicado de esto,ver ese enlace para obtener detalles sobre cómodeberí hacer llamadas al sistema en código de 32 o 64 bits. Si quieres entender qué sucedió exactamente, sigue leyendo.

syscallas llamadas al sistema @ son más rápidas queint 0x80l sistema @ llama, así que use el nativo de 64 bitssyscall a menos que esté escribiendo código de máquina políglota que se ejecute igual cuando se ejecuta como 32 o 64 bits. sysenter siempre regresa en modo de 32 bits, por lo que no es útil desde el espacio de usuario de 64 bits, aunque es una instrucción x86-64 válida).

Relacionado: La guía definitiva para las llamadas al sistema Linux (en x86) para saber cómo hacerint 0x80 osysenter Llamadas de sistema de 32 bits, osyscall Llamadas de sistema de 64 bits, o llamando al vDSO para llamadas de sistema "virtuales" comogettimeofday. Además de los antecedentes de las llamadas al sistema.

Utilizandoint 0x80 hace posible escribir algo que se ensamblará en modo de 32 o 64 bits, por lo que es útil para unexit_group() al final de un microbenchmark o algo así.

Los PDF actuales de los documentos oficiales de psABI i386 y x86-64 System V que estandarizan la función y las convenciones de llamadas syscall están vinculados desdehttps: //github.com/hjl-tools/x86-psABI/wiki/X86-psAB.

Ver el x86 tag wiki para guías para principiantes, manuales x86, documentación oficial y guías / recursos de optimización del rendimiento.

Pero ya que las personas siguen publicando preguntas con código que usaint 0x80 en código de 64 bits, o accidentalmentebuilding binarios de 64 bits de la fuente escrita para 32 bits, me preguntoquéexactament ¿sucede en Linux actual?

Haceint 0x80 guardar / restaurar todos los registros de 64 bits? ¿Trunca algún registro a 32 bits? ¿Qué sucede si pasa argumentos de puntero que tienen mitades superiores distintas de cero?

¿Funciona si lo pasas punteros de 32 bits?

Respuestas a la pregunta(1)

Su respuesta a la pregunta