2013-09-27 16 views
16

Nella classe dei sistemi operativi, mi viene chiesto se il passaggio da utente a modalità kernel sia privilegiato. Questo non è specifico per il sistema operativo. In un primo momento ho pensato che sì, ma sembra come un grande fermo 22. ho fatto riferimento al mio libro di testo:Passaggio dalla modalità utente alla modalità kernel

L'hardware permette istruzioni privilegiate da eseguire solo in modalità kernel. ...

L'istruzione per passare alla modalità kernel è un esempio di un'istruzione con privilegi .

Gagne, Greg; Abraham Silberschatz; Peter B. Galvin (2010-01-26). Concetti relativi al sistema operativo (p. 22). Wiley Higher Ed. Edizione Kindle.

Così iniziamo in modalità utente. Per passare alla modalità kernel richiede un'istruzione privilegiata. Un'istruzione privilegiata deve essere eseguita in modalità kernel, quindi dobbiamo passare alla modalità kernel per abilitare il passaggio alla modalità kernel.

Penso che il sistema non consenta a un utente di passare direttamente alla modalità kernel, ma che viene eseguito dal kernel quando l'utente cerca di eseguire un'altra istruzione con privilegi. È corretto?

+0

Quindi è davvero un errore di battitura? – denis631

risposta

6

Questo è un errore di battitura introdotta nella 8 ° edizione e conservato nel 9 °. Nella settima edizione, pagina 19, si legge invece:

"L'istruzione per passare alla modalità utente è un esempio di una privilegiata istruzioni."

Che chiaramente ha molto più senso.

+1

Non ne sono così sicuro. Il [errata] (http://codex.cs.yale.edu/avi/os-book/OS7/os7c/online-dir/os7-errata.pdf) per la 7a edizione indica chiaramente che l'8 ° (e quindi 9 °) edizione corretta ... (Il che significa che è stato identificato come un errore nella settima edizione.) – Ephemera

+0

@ephemera le persone che mantengono l'errata sono probabilmente studenti. – atulgangwar

+1

come ha più senso che il passaggio alla modalità kernel non richieda privilegi ?? (ogni programma può semplicemente farlo?) – Rptk99

0

Nella terra utente, si richiedono operazioni con privilegi tramite chiamate di sistema al kernel, che esegue il passaggio alla modalità kernel secondo necessità. L'utente sta usando un'API, il kernel sta eseguendo le operazioni privilegiate.

3

Di solito ci sono un insieme di istruzioni che non sono in realtà per passare alla modalità kernel in modo generale, ma per richiedere i servizi di sistema. Quindi questi passano alla modalità kernel, ma solo nel contesto della chiamata di alcune funzionalità che sono state impostate dal sistema operativo allo scopo di essere chiamate da un codice utente.

Nella maggior parte dei sistemi moderni, anche questo è nascosto da un livello API che implementa una funzione specifica di cui una parte potrebbe eseguire una chiamata al sistema operativo come sopra.

Ma in generale è vero che il codice utente non può fare l'equivalente di dire "da questo punto in poi, voglio essere in esecuzione in modalità kernel".

+0

Ciò significa che ci sono istruzioni, che passano alla modalità kernel per chiamare altri servizi di sistema, ma la domanda non viene ancora risposta, IMO. Se il passaggio alla modalità kernel è un'istruzione privilegiata, nessuno può farlo dalla modalità utente, giusto? Totalmente confuso ... – denis631

30

In modalità utente non è possibile passare alla modalità kernel. L'interazione tra utente e kernel avviene tramite chiamate di sistema. Ogni chiamata di sistema fornisce un servizio definito. L'utente invia il nome del servizio (di solito un numero) e i parametri richiesti. Ecco un esempio reale di come è fatto. È assemblatore di stile T AT x2 AT &.

Sposta il nome di chiamata di sistema nel registro EAX, il puntatore ai parametri nel registro EBX della CPU e quindi emette il numero di interrupt software 42. La gestione dell'interrupt passerà alla modalità kernel. Il numero di interrupt viene ricercato nella Tabella dei descrittori degli interrupt (IDT) e richiama la funzione che è registrata lì, il gestore syscall. Questo gestore viene eseguito in modalità kernel. Al ritorno alla modalità utente il codice sposterà il contenuto di EAX nella variabile ret.

pok_ret_t pok_do_syscall (pok_syscall_id_t syscall_id, pok_syscall_args_t* args) 
{ 
    pok_ret_t ret; 
    uint32_t args_addr; 
    uint32_t id; 

    args_addr = (uint32_t) args; 
    id  = (uint32_t) syscall_id; 

    asm volatile ("movl %1,%%eax \n\t" 
       "movl %2,%%ebx \n\t" 
       "int $42  \n\t" 
       "movl %%eax, %0 \n\t" 
       :"=g"(ret) 
       :"g"(id), "g"(args_addr) 
       : "%eax" , "%ebx" 
       ); 
    return ret; 
} 

Il OS Dev wiki è un buon punto per saperne di più su questo.

Quindi non si passa semplicemente al kernel, ma è possibile chiedere al kernel di fare qualcosa per voi. E poi il kernel ti sta dicendo se è stato fatto o no.

+1

Questa è la risposta corretta e mi ha aiutato molto. Grazie! –

+0

Sì che è una risposta eccellente, ma per quanto riguarda la modalità di bit ... Quando ci si cambia ... –

+0

@BaradwajAryasomayajula Vuoi dire [CR0.pe] (http://wiki.osdev.org/CPU_Registers_x86#CR0) ? Perché questo è rilevante per te? Forse questa è una domanda a parte. Non posso darti una risposta precisa, ma l'istruzione "int" eseguita dalla CPU solleva un interrupt, che avvia il passaggio alla modalità kernel. Potresti voler dare un'occhiata al [Manuale Intel] (https://www-ssl.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) per maggiori dettagli. – Philipp

Problemi correlati