SoloCodigo

Programación General => ASM (Ensamblador) => Mensaje iniciado por: marcialre en Domingo 25 de Octubre de 2009, 00:01

Título: Llamadas al systema den Linix x86_64
Publicado por: marcialre en Domingo 25 de Octubre de 2009, 00:01
He visto que hay dos métodos para realizar una llamada al sistema en Linux x86_64. Uno hace uso del tradicional int $0x80 y otro hace uso de la instrucción syscall. ¿Cuál es más adecuado?

También he visto que el orden de los parámetros es diferente si se utiliza el segundo método. ¿Cuál es el nuevo orden?

Gracias.
Título: Re: Llamadas al systema den Linix x86_64
Publicado por: Eternal Idol en Domingo 25 de Octubre de 2009, 01:12
syscall (o sysenter) es mejor, es una instruccion especificamente creada para pasar rapidamente a modo Kernel. Los parametros dependen de la convencion de llamada y no de la instruccion en si misma (salvo rcx en syscall), por ejemplo Windows usa stdcall (http://en.wikipedia.org/wiki/Stdcall#stdcall), en 32 bits un registro (eax) indica el numero de servicio y otro (edx) indica el puntero a la pila con los parametros, en 64 bits usa registros tal como establece la convencion (http://en.wikipedia.org/wiki/Stdcall#Microsoft_x64_calling_convention) para los parametros excepto para el primero (rcx) que usa (r10), esto se debe a que syscall guarda en rcx la instruccion a la que retornar. Por lo que puedo leer en Wikipedia Linux sigue la convencion de la ABI de AMD64 (http://en.wikipedia.org/wiki/Stdcall#AMD64_ABI_convention) (RDI, RSI, RDX, RCX, R8 and R9 + pila, asumo que ponen rcx en otro lado por logica).
Título: Re: Llamadas al systema den Linix x86_64
Publicado por: marcialre en Domingo 25 de Octubre de 2009, 01:52
Mil gracias. En un día me has solucionado 4 dudas... :good:
Título: Re: Llamadas al systema den Linix x86_64
Publicado por: Eternal Idol en Domingo 25 de Octubre de 2009, 06:55
De nadas  B)