Pregunta

Inspirado por esta pregunta

¿Cómo puedo forzar el desmontaje de GDB?

y relacionado con este

¿Qué es la INT 21h?

¿Cómo ocurre realmente una llamada al sistema en Linux?¿Qué sucede cuando se realiza la llamada, hasta que se invoca la rutina real del núcleo?

¿Fue útil?

Solución

Si se asume que estamos hablando de 86:

  1. ID de la llamada al sistema es depositada en el registro EAX
  2. Los argumentos necesarios por la llamada de sistema se depositan en la ubicaciones dictadas por la llamada al sistema . Por ejemplo, algunas llamadas al sistema esperan que su argumento de que resida en el registro EBX. Otros pueden esperar que su argumento para estar sentado en la parte superior de la pila.
  3. Una interrupción INT 0x80 se invoca.
  4. El servicios del núcleo de la llamada al sistema de Linux identificado por el ID en el registro EAX, depositar ningún resultado en lugares predeterminados.
  5. El código de llamada hace uso de ningún resultado.

Puede que sea un poco oxidado en esto, ha sido un par de años ...

Otros consejos

Las respuestas dadas son correctas, pero me gustaría añadir que hay más mecanismos para entrar en modo de núcleo. Cada núcleo reciente mapas de la página "vsyscall" en cada espacio de direcciones del proceso. Contiene poco más que el método de captura de llamada al sistema más eficiente.

Por ejemplo en un sistema de 32 bits ordinario que podría contener:

 
0xffffe000: int $0x80
0xffffe002: ret

Sin embargo, en mi 64 bitsystem tengo acceso a la manera método más eficiente el uso de las instrucciones syscall / SYSENTER


0xffffe000: push   %ecx
0xffffe001: push   %edx
0xffffe002: push   %ebp
0xffffe003:     mov    %esp,%ebp
0xffffe005:     sysenter 
0xffffe007: nop    
0xffffe008: nop    
0xffffe009: nop    
0xffffe00a: nop    
0xffffe00b: nop    
0xffffe00c: nop    
0xffffe00d: nop    
0xffffe00e:     jmp    0xffffe003
0xffffe010: pop    %ebp
0xffffe011: pop    %edx
0xffffe012: pop    %ecx
0xffffe013: ret    

Esta página vsyscall también asigna algunos systemcalls que se pueden hacer sin un cambio de contexto. Sé cierta gettimeofday , tiempo y getcpu se asignan allí, pero me imagino getpid podría encajar allí como también.

Esto ya está contestada en
¿Cómo es la llamada al sistema implementado en Linux?
Probablemente no ha coincidido con esta pregunta debido a la "syscall" el uso término diferentes.

Básicamente, es muy simple: En algún lugar de la memoria se encuentra una mesa en la que se almacena cada número syscall y la dirección del controlador correspondiente (véase http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32.S para las arquitecturas x86 versión)

El controlador de interrupción INT 0x80 a continuación, sólo toma los argumentos de los registros, los pone en la pila (kernel), y llama al controlador de llamada al sistema apropiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top