CPU passa dalla modalità utente a modalità kernel: Che cosa fa? Come ci si rende questa transizione?

StackOverflow https://stackoverflow.com/questions/2479118

Domanda

CPU Passa in modalità utente al Kernel Mode: Che cosa fa? Come ci si rende questa transizione?

Modifica

Anche se si tratta di architettura dipendente si prega di fornire me con una risposta. L'architettura è a voi. Dimmi per l'architettura che conosci.

Voglio avere un'idea di ciò che tutte le cose saranno coinvolti in essa.

È stato utile?

Soluzione

Nota: questo è per lo più rilevante per architettura x86. Ecco una spiegazione un po 'semplificata.

Il passaggio di solito è causato da uno dei seguenti:

  • guasto (ad esempio un errore di pagina o qualche altra eccezione causato eseguendo un'istruzione)
  • Interrupt (per esempio un interrupt di tastiera o I finitura / O)
  • Trap (ad esempio una chiamata di sistema)

Quello che normalmente accade è che il sistema controlla il descrittore tabella di interrupt (IDT). Ciascuna eccezione (interrupt, guasto, ecc) ha un numero ad esso associato che viene utilizzato per indicizzare in questa tabella.

Da questa tabella la CPU in grado di determinare il gestore di interrupt per l'esecuzione.

Come parte della transizione seguenti modifiche (generalmente) abbiano effetto:

  • Passa alla Kernel pila
  • EFLAGS vengono salvate
  • selettore di segmento di codice e EIP vengono salvate.
  • pila di selezione segmento e stack pointer sono salvati
  • Avvia l'esecuzione del gestore di interrupt
  • I registri di uso generale vengono salvate (lavoro del conduttore)
  • selettori di segmento vengono cambiati a quelli del kernel (il lavoro del gestore)

Ora sei in modalità kernel.

La speranza che aiuta:)

Altri suggerimenti

Ecco dipende dal sistema, ma il solito meccanismo è qualche operazione userland provoca un interrupt software. Che interrompono rende i modi dell'interruttore del processore e saltare nel codice del kernel, che poi controlla ciò che il programma stava cercando di fare (chiamata di sistema?) E poi fa l'azione richiesta e ritorna al codice in modalità utente. Altri meccanismi oltre un interrupt software potrebbe causare la transizione pure; ad esempio in un sistema multitasking preemptive, un interrupt timer potrebbe innescare lo scheduler per l'esecuzione.

La mia comprensione è che qualsiasi programma il cui segmento registri hanno i due LSB zero sia in esecuzione in modalità kernel, mentre qualsiasi programma i cui registri di segmento hanno i due LSB = 1 sarà in esecuzione in modalità utente. In realtà, i due LSB dei rgeisters segmento definire il livello Priviledge (0 più alto al più basso 3)

Quindi, per fare una corsa prgram in modalità kernel è necessario impostare il segmento di registri da 0010 hex (credo). Io non sono sicuro di come è possibile inserire un programma in quello spazio di memoria senza sovrascrivere qualcos'altro - in altre parole, come fa il linker assicurare che? Inoltre, se si desidera chiamare il codice in modalità kernel dal codice in modalità utente, è necessario capire come passare parametri - non usano la stessa soace memoria, in modo Non è possibile passare i dati per riferimento memoria. Credo che devi passare in registri.

Se anynody può colmare le lacune in quanto sopra, sarei molto grato.

In Windows, quando si effettua una chiamata di sistema, le routine di libreria chiamano entrypoint kernel che risiede nello spazio di indirizzi del sistema operativo. E a sua volta prende la CPU in modalità supervisore eseguendo una specifica istruzione per questo scopo, come ad esempio SYSENTER . Ciò che fa è essenzialmente mettendo un po 'nelle bandiere registrati. Ciò consente al sistema operativo di utilizzare istruzioni privilegiate.

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