Come fa una chiamata di sistema effettivamente accadere su linux?
-
12-09-2019 - |
Domanda
Ispirato da questa domanda
Come posso forzare GDB di smontare?
e relativo a questo
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?
Soluzione
Supponendo che stiamo parlando di 86:
- Il ID della chiamata di sistema è depositato nel registro EAX
- 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.
- Un interrupt
INT 0x80
viene richiamato. - Il kernel servizi la chiamata di sistema Linux individuati dalla ID nel registro EAX, depositando risultati in posizioni predeterminate.
- 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.