
Sé que hay una syscall
convención, pero ¿cómo se llama la convención de llamadas que la precede y que ves cuando llamas a int 80
en lugar de syscall
, así?
mov rax,4 ; system call number (sys_write)
mov rbx,1 ; file descriptor (stdout)
mov rcx,hello ; message to write
mov rdx,12 ; message length
int 0x80 ; call kernel
Yo leoaquíque los argumentos después rdx
son esi
,, edi
( ebp
o para x64 ,,, rsi
) , no lo veo documentado enrdi
rbp
La página de Wikipedia para convocar convenciones., peroint80h¿Parece indicar que Windows también usa esta convención?
¿Cómo se llama esta convención? ¿En qué parte del código fuente del kernel de Linux puedo verlo definido? ¿Y dónde está la mesa que resuelve rax
los trámites cuando llamas int 0x80
? Para syscall
essys_write
rax=1
Respuesta1
Su pregunta cubre varios temas, intentaré abordarlos todos.
No estoy seguro de que exista un término único y canónico para la forma en que se invocan las llamadas al sistema, menos aún para una forma específica en la que se invocan las llamadas al sistema (interrupción 0x80 en lugar de
SYSENTER
oSYSCALL
). En x86-64, eldocumentadoLa interfaz de llamada al sistema, usandoSYSCALL
, se describe en System V x86-64 ABI, pero eso es solo informativo, no normativo. Del mismo modo, si bien la mayoría de la gente entendería de qué estás hablando si te refieres a él como “i386 Linux kernel ABI” (reemplazando “i386” con cualquier arquitectura de la que estés hablando), eso también podría resultar confuso ya que “kernel ABI” tiene otro significado (en el contexto de los módulos del kernel) y, nuevamente, no se limita a interrumpir 0x80.En la práctica, la mayoría de las personas no deberían preocuparse por los detalles hasta este nivel de detalle, especialmente porque pueden evolucionar: interrumpir 0x80,
SYSCALL
etc. como usted menciona, pero también el vDSO que introduce sus propias sutilezas y es el punto de entrada preferido. para todas las llamadas al sistema en x86 hoy en día... Por supuesto, esto no significa que no pueda haber un término para referirse a una convención de llamadas específica, pero no estoy seguro de que sea tan útil.Windows también admite el uso de una interrupción para su interfaz de llamada al sistema, 0x2E, pero su "convención de llamada" esbastante diferente: los argumentos se insertan en la pila, EAX proporciona la llamada al sistema solicitada y EBX apunta a los argumentos en la pila.
Los kernels x86 actuales definen la interfaz de llamada del sistema en
arch/x86/entry
:entry_32.S
contiene la interfaz i386,entry_64.S
la interfaz x86-32 y x86-64,entry_64_compat.S
la interfaz x86-64 de 32 bits (para compatibilidad con versiones anteriores),syscalls/syscall_32.tbl
la tabla de llamadas del sistema i386,syscalls/syscall_64.tbl
la tabla de llamadas del sistema x86-32 y x86-64.Los comentarios en esos archivos documentan la interfaz, en particular cómo se pasan los argumentos: para llamadas de 32 bits, EAX contiene el número de llamada del sistema y sus parámetros se colocan en EBX, ECX, EDX, ESI, EDI y EBP (el parámetro mismo for
SYSENTER
, un puntero a la pila de usuarios que contiene el parámetro para la interrupción 0x80); para llamadas de 64 bits, RAX contiene el número de llamada del sistema y sus parámetros se colocan en RDI, RSI, RDX, R10, R8 y R9 (consulte también¿Por qué los registros de llamadas del sistema y el orden cambiaron de Intel de 32 bits a 64 bits?). Hay un buen resumen con diagramas encalling.h
.
Como nota al margen, las comparaciones históricas a menudo se refieren a la interfaz de llamada de MS-DOS, que utilizaba principalmenteinterrumpir 0x21; también incluía la interrupción multiplex,0x2F, que proporcionóun mecanismo extensiblepara agregar servicios del sistema (que generalmente involucran TSR; los controladores de dispositivos usaban principalmente una interfaz diferente).