2009-08-21 18 views
82

Quali sono le differenze tra Modalità utente e Modalità kernel, perché e come si attiva una di queste e quali sono i loro casi d'uso?Qual è la differenza tra le modalità utente e kernel nei sistemi operativi?

+0

Possibile duplicato di [Qual è la differenza tra lo spazio del kernel e lo spazio utente?] (Https://stackoverflow.com/questions/5957570/what-is-the-difference-between-the-kernel-space- e-the-user-space) –

+0

@SalvadorDali ciao, il consenso attuale è quello di chiudere con "qualità": http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its -much-newer-and-ha Dal momento che la "qualità" non è misurabile, passo semplicemente alle upvotes. ;-) Probabilmente si tratta di quale domanda abbia colpito le migliori parole chiave newb di Google sul titolo. Vi incoraggio a copiare semplicemente la vostra risposta con una dichiarazione di non responsabilità aggiunta in basso e il link da questa, nel caso in cui si chiuda. –

risposta

117
  1. Kernel Mode

    In modalità kernel, il codice dell'esecuzione ha completo e illimitato accesso all'hardware sottostante. È in grado di eseguire qualsiasi istruzione della CPU e fare riferimento a qualsiasi indirizzo di memoria. La modalità kernel è generalmente riservata alle funzioni più affidabili e di livello più basso del sistema operativo. Arresti anomali nella modalità kernel sono catastrofici; loro interromperà l'intero PC.

  2. User Mode

    in modalità utente, il codice di esecuzione non ha possibilità di accedere direttamente memoria hardware o di riferimento. Il codice in esecuzione in modalità utente deve delegare alle API di sistema per accedere all'hardware o alla memoria . A causa della protezione offerta da da questo tipo di isolamento, i crash in modalità utente sono sempre recuperabili. La maggior parte del codice in esecuzione sul computer verrà eseguita in modalità utente.

Leggere più

Understanding User and Kernel Mode

+0

Mi chiedo quando la CPU sta eseguendo il codice del sistema operativo, in quale modalità si trova il processore? – JackieLam

+2

@JackieLam: dovrebbe essere in modalità kernel. – kadina

+0

Quindi, di per sé, per eseguire un processo __user space__, deve essere mappato su __kernel space__? – roottraveller

5

Ho intenzione di fare una pugnalata al buio e credo che tu stia parlando di Windows. In poche parole, la modalità kernel ha pieno accesso all'hardware, ma la modalità utente no. Ad esempio, molti se non la maggior parte dei driver di periferica sono scritti in modalità kernel perché devono controllare i dettagli più fini del loro hardware.

Vedere anche this wikibook.

+2

Questo è importante per te come programmatore, perché i bug del kernel tendono a causare devastazioni molto peggiori di quelle a cui potresti essere abituato. Una delle ragioni della distinzione tra kernel e utente è che il kernel può monitorare/controllare le risorse di sistema critiche e proteggere ciascun utente dagli altri. È un po 'troppo semplificato, ma comunque utile, per ricordare a te stesso che i bug degli utenti sono spesso fastidiosi, ma i bug del kernel tendono a ridurre l'intera macchina. –

3

altre risposte già spiegato la differenza tra la modalità kernel utente e. Se vuoi davvero entrare nei dettagli dovresti ottenere una copia di Windows Internals, un eccellente libro scritto da Mark Russinovich e David Solomon che descrive l'architettura e i dettagli interni dei vari sistemi operativi Windows.

40

Queste sono due diverse modalità in cui il computer può funzionare. Prima di questo, quando i computer erano come una grande stanza, se qualcosa andava in crash, interrompeva l'intero computer. Quindi gli architetti informatici decidono di cambiarlo. I moderni microprocessori implementano nell'hardware almeno 2 stati diversi.

modalità utente:

  • modalità in cui tutti i programmi utente eseguiti. Non ha accesso alla RAM e all'hardware. La ragione di ciò è dovuta al fatto che se tutti i programmi fossero eseguiti nella modalità kernel , sarebbero in grado di sovrascrivere la memoria l'uno dell'altro. Se è necessario accedere a una di queste funzionalità, effettua una chiamata all'API sottostante . Ogni processo avviato da Windows ad eccezione del processo di sistema viene eseguito in modalità utente.

modalità kernel:

  • modalità in cui tutti i programmi del kernel execute (driver diversi). Ha l'accesso ad ogni risorsa e hardware sottostante. È possibile eseguire qualsiasi istruzione CPU e accedere a tutti gli indirizzi di memoria. Questa modalità è riservata ai driver che operano al livello più basso

Come avviene l'interruttore.

Il passaggio dalla modalità utente alla modalità kernel non viene eseguito automaticamente dalla CPU. La CPU viene interrotta da interrupt (timer, tastiera, I/O). Quando si verifica un'interruzione, la CPU interrompe l'esecuzione del programma in esecuzione corrente, passa alla modalità kernel, esegue il gestore di interrupt. Questo gestore salva lo stato della CPU, esegue le sue operazioni, ripristina lo stato e torna alla modalità utente.

http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

http://en.wikipedia.org/wiki/Direct_memory_access

http://en.wikipedia.org/wiki/Interrupt_request

+0

Mi chiedo quando la CPU sta eseguendo il codice del sistema operativo, in quale modalità si trova il processore? – JackieLam

+1

@JackieLam: modalità kernel –

7

Un processore in un computer che esegue Windows dispone di due modalità differenti: modalità utente e modalità kernel. Il processore passa da una modalità all'altra a seconda del tipo di codice in esecuzione sul processore. Le applicazioni vengono eseguite in modalità utente e i componenti del sistema operativo principale vengono eseguiti in modalità kernel. Mentre molti driver vengono eseguiti in modalità kernel, alcuni driver possono essere eseguiti in modalità utente.

Quando si avvia un'applicazione in modalità utente, Windows crea un processo per l'applicazione. Il processo fornisce all'applicazione uno spazio di indirizzamento virtuale privato e una tabella di handle privata. Poiché lo spazio degli indirizzi virtuali di un'applicazione è privato, un'applicazione non può alterare i dati che appartengono a un'altra applicazione. Ogni applicazione viene eseguita separatamente e, se un'applicazione si blocca, l'arresto anomalo si limita a quell'unica applicazione. Altre applicazioni e il sistema operativo non sono interessati dal crash.

Oltre ad essere privato, lo spazio di indirizzamento virtuale di un'applicazione in modalità utente è limitato. Un processore in esecuzione in modalità utente non può accedere agli indirizzi virtuali riservati per il sistema operativo. La limitazione dello spazio di indirizzamento virtuale di un'applicazione in modalità utente impedisce all'applicazione di alterare, e potenzialmente danneggiando, i dati critici del sistema operativo.

Tutto il codice che viene eseguito in modalità kernel condivide un singolo spazio di indirizzi virtuali. Ciò significa che un driver in modalità kernel non è isolato dagli altri driver e dal sistema operativo stesso. Se un driver in modalità kernel scrive accidentalmente all'indirizzo virtuale sbagliato, i dati che appartengono al sistema operativo o ad un altro driver potrebbero essere compromessi. Se un driver in modalità kernel si arresta in modo anomalo, l'intero sistema operativo si arresta in modo anomalo.

Se sei un utente di Windows, una volta passato attraverso questo link ne avrai di più.

Communication between user mode and kernel mode

1

Cosa

Fondamentalmente la differenza tra le modalità kernel e utente non è dipende dal sistema operativo e si ottiene soltanto limitando alcune istruzioni da eseguire solo in modalità kernel per mezzo di progettazione hardware.Tutti gli altri scopi, come la protezione della memoria, possono essere eseguiti solo da tale restrizione.

Come

significa che il processore vive sia nella modalità kernel o in modalità utente. Utilizzando alcuni meccanismi, l'architettura può garantire che, ogni volta che si passa alla modalità kernel, il codice del SO viene recuperato per essere eseguito.

Perché

Avere questa infrastruttura hardware questi potrebbero essere raggiunti in sistemi operativi comuni:

  • Protezione programmi utente di accedere tutta la memoria, non lasciare che i programmi di sovrascrivere il sistema operativo, ad esempio,
  • impedisce ai programmi utente di eseguire istruzioni sensibili come quelle che modificano i limiti del puntatore della memoria della CPU, per non lasciare che i programmi interrompano i limiti di memoria, ad esempio.
2

anelli della CPU sono più chiara distinzione

In modalità x86 protetta, la CPU è sempre in uno dei 4 anelli. Il kernel Linux utilizza solo 0 e 3:

  • 0 per il kernel
  • 3 per gli utenti

Questa è la definizione più duro e veloce di modalità kernel vs modalità utente.

Perché Linux non usa anelli 1 e 2: CPU Privilege Rings: Why rings 1 and 2 aren't used?

Come è l'anello di corrente determinato?

L'anello corrente viene selezionato da una combinazione di:

  • tabella descrittore globale: una tabella in memoria immissioni GDT, e ciascuna voce ha un campo Privl che codifica l'anello.

    L'istruzione LGDT imposta l'indirizzo nella tabella dei descrittori corrente.

    Consulta anche: http://wiki.osdev.org/Global_Descriptor_Table

  • segmento registra CS, DS, ecc, che indicano l'indice di una voce nel GDT.

    Ad esempio, CS = 0 indica che la prima voce del GDT è attualmente attiva per il codice di esecuzione.

Cosa può fare ogni anello?

Il chip della CPU è fisicamente costruito in modo tale che:

  • anello 0 può fare nulla

  • ring 3 non è possibile eseguire diverse istruzioni e scrivere su più registri, più in particolare:

    • non può cambiare il proprio anello! Altrimenti, potrebbe impostarsi per suonare 0 e gli anelli sarebbero inutili.

      In altre parole, non è possibile modificare l'attuale segment descriptor, che determina l'anello corrente.

    • non può modificare le tabelle di pagina: How does x86 paging work?

      In altre parole, non possono modificare il registro CR3, e il paging si impedisce la modifica delle tabelle di pagina.

      Ciò impedisce ad un processo di visualizzare la memoria di altri processi per motivi di sicurezza/facilità di programmazione.

    • non è in grado di registrare gestori di interrupt. Quelli sono configurati scrivendo in posizioni di memoria, il che è anche impedito dal paging.

      I gestori corrono nell'anello 0 e interrompono il modello di sicurezza.

      In altre parole, non è possibile utilizzare le istruzioni LGDT e LIDT.

    • non può eseguire istruzioni IO come in e out e quindi avere accessi hardware arbitrari.

      Altrimenti, ad esempio, i permessi dei file sarebbero inutili se qualsiasi programma potesse leggere direttamente dal disco.

      Più precisamente grazie a Michael Petch: in realtà è possibile che il sistema operativo consenta istruzioni IO sull'anello 3, questo è effettivamente controllato dallo Task state segment.

      Ciò che non è possibile è che l'anello 3 si autorizzi a farlo se non lo avesse in primo luogo.

      Linux lo disattiva sempre. Vedi anche: Why doesn't Linux use the hardware context switch via the TSS?

Come fare come i programmi e sistemi operativi passaggio tra gli anelli?

  • quando la CPU è acceso, esso inizia l'esecuzione del programma iniziale anello 0 (tipo di bene, ma è una buona approssimazione). Puoi pensare che questo programma iniziale sia il kernel (ma normalmente è un bootloader che chiama il kernel ancora nell'anello 0).

  • quando un processo di utente desidera che il kernel esegua qualcosa come scrive un file, utilizza un'istruzione che genera un interrupt come int 0x80 per segnalare il kernel.

    Quando ciò accade, la CPU chiama e interrompe il gestore di callback che il kernel ha registrato al momento dell'avvio.

    Questo gestore viene eseguito in ring 0, che decide se il kernel consentirà questa azione, fare l'azione, e riavviare il programma userland in ring 3.

  • quando si utilizza la chiamata di sistema exec (o quando il kernel will start /init), il kernel prepares the registers and memory del nuovo processo userland, quindi salta al punto di ingresso e passa la CPU a suonare 3

  • Se il programma cerca di fare qualcosa di cattivo, come in scrittura a un registro proibita o l'indirizzo di memoria (a causa del paging), la CPU chiama anche alcuni gestori di callback del kernel nell'anello 0.

    Ma dal momento che il campo utente era cattivo, il kernel potrebbe uccidere il processo questa volta, o dargli un avvertimento con un segnale.

  • Quando il kernel si avvia, imposta un orologio hardware con una frequenza fissa, che genera periodicamente degli interrupt.

    Questo orologio hardware genera gli interrupt che eseguono lo squillo 0 e consente di pianificare i processi dell'utente che si attivano.

    In questo modo, la pianificazione può verificarsi anche se i processi non effettuano chiamate di sistema.

Qual è il punto di avere più squilli?

Ci sono due principali vantaggi della separazione kernel e userland:

  • è più facile fare programmi, come si è più certo non interferirà con l'altro. Ad esempio, un processo di userland non deve preoccuparsi di sovrascrivere la memoria di un altro programma a causa del paging, né di mettere l'hardware in uno stato non valido per un altro processo.
  • è più sicuro. Per esempio. le autorizzazioni per i file e la separazione della memoria potrebbero impedire a un'app di hacking di leggere i dati bancari. Ciò suppone, naturalmente, che ti fidi del kernel.

anelli negativi

Mentre anelli negativi non sono in realtà fa riferimento nel manuale di Intel, ci sono in realtà le modalità di CPU che hanno ulteriormente le capacità di anello 0 per sé, e così sono una buona misura per il "negativo anello "nome.

Un esempio è la modalità hypervisor utilizzata nella virtualizzazione.

Per ulteriori dettagli si veda: https://security.stackexchange.com/questions/129098/what-is-protection-ring-1

Come giocare con essa?

Ho creato un setup di metallo nudo che dovrebbe essere un buon modo per manipolare direttamente anelli: https://github.com/cirosantilli/x86-bare-metal-examples

non ho avuto la pazienza di fare un esempio userland purtroppo, ma sono andato per quanto configurazione di paging, quindi userland dovrebbe essere fattibile.Mi piacerebbe vedere una richiesta di pull.

+1

Poiché questa domanda non è specifica per qualsiasi sistema operativo, 'in' e' out' sono disponibili per squillare 3. Il TSS può puntare a una tabella di autorizzazioni IO nell'attività corrente che garantisce l'accesso in lettura/scrittura a tutte o specifiche porte. –

+0

Naturalmente si impostano i bit IOPL sul valore 3, quindi il programma ring 3 ha accesso completo alla porta e le autorizzazioni TSS IO non si applicano. –

+0

@MichaelPetch grazie, non lo sapevo. Ho aggiornato la risposta. –

Problemi correlati