¿Cómo se llama la convención de llamada detrás de "int 0x80"?

¿Cómo se llama la convención de llamada detrás de "int 0x80"?

Sé que hay una syscallconvención, pero ¿cómo se llama la convención de llamadas que la precede y que ves cuando llamas a int 80en 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 rdxson esi,, edi( ebpo para x64 ,,, rsi) , no lo veo documentado enrdirbpLa 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 raxlos trámites cuando llamas int 0x80? Para syscallessys_writerax=1

Respuesta1

Su pregunta cubre varios temas, intentaré abordarlos todos.

  1. 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 SYSENTERo SYSCALL). En x86-64, eldocumentadoLa interfaz de llamada al sistema, usando SYSCALL, 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, SYSCALLetc. 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.

  2. 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.

  3. Los kernels x86 actuales definen la interfaz de llamada del sistema enarch/x86/entry:entry_32.Scontiene la interfaz i386,entry_64.Sla interfaz x86-32 y x86-64,entry_64_compat.Sla interfaz x86-64 de 32 bits (para compatibilidad con versiones anteriores),syscalls/syscall_32.tblla tabla de llamadas del sistema i386,syscalls/syscall_64.tblla 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).

información relacionada