Domanda

Ispirato da questa domanda

Come posso forzare GDB di smontare?

e relativo a questo

Qual è INT 21h?

Come fa una chiamata di sistema effettivamente accadere sotto linux? cosa succede quando viene eseguita la chiamata, fino a quando viene richiamata la routine del kernel attuale?

È stato utile?

Soluzione

Supponendo che stiamo parlando di 86:

  1. Il ID della chiamata di sistema è depositato nel registro EAX
  2. gli argomenti richiesti dalla chiamata di sistema sono depositati nel posizioni dettate dalla chiamata di sistema . Ad esempio, alcune chiamate di sistema si aspettano che il loro argomento di risiedere nel registro EBX. Altri possono aspettarsi la loro tesi di essere seduto in cima alla pila.
  3. Un interrupt INT 0x80 viene richiamato.
  4. Il kernel servizi la chiamata di sistema Linux individuati dalla ID nel registro EAX, depositando risultati in posizioni predeterminate.
  5. Il codice chiamante fa uso di alcun risultato.

Posso essere un po 'arrugginito a questo, è stato un paio di anni ...

Altri suggerimenti

Le date risposte sono corrette, ma vorrei aggiungere che ci sono più meccanismi per entrare in modalità kernel. Ogni kernel recente mappa la pagina "vsyscall" in ogni processo spazio di indirizzi. Esso contiene poco più che il più efficace metodo di trappola syscall.

Per esempio su un normale sistema a 32 bit potrebbe contenere:

 
0xffffe000: int $0x80
0xffffe002: ret

Ma sul mio 64 bitsystem ho accesso al modo metodo più efficiente utilizzando le istruzioni 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    

Questa pagina vsyscall associa anche alcune systemcalls che può essere fatto senza un cambio di contesto. So certo gettimeofday , tempo e getcpu sono mappati lì, ma immagino getpid potrebbero rientrare in là proprio come bene.

Questa è già una risposta a
Come è la chiamata di sistema in Linux implementato?
Probabilmente non corrisponde a questa domanda a causa della diversa "syscall" utilizzo termine.

Fondamentalmente, è molto semplice: qualche parte in memoria si trova una tabella in cui sono memorizzati ogni numero syscall e l'indirizzo della corrispondente funzione (si veda http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32.S per x86 versione)

Il gestore di interrupt 0x80 INT poi basta prende gli argomenti fuori dei registri, li mette sullo stack (kernel), e chiama il gestore syscall appropriata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top