2010-10-01 17 views
5

la mia domanda è come esattamente il sistema operativo protegge la sua parte del kernel.In che modo esattamente il sistema operativo protegge il kernel

Da quello che ho trovato ci sono fondamentalmente 2 modalità kernel e utente. E ci dovrebbero essere alcuni bit nei segmenti di memoria che si tels se un segmento di memoria è kernel o segmento di spazio utente. Ma dov'è l'origine di quei pezzi? C'è qualche "switch" nel compilatore che contrassegna i programmi come programmi del kernel? Ad esempio, se il driver è in modalità kernel, in che modo il sistema operativo gestisce la sua integrazione con il sistema, quindi non è aggiunto software dannoso come driver?

Se qualcuno potesse illuminarmi su questo problema, sarei molto grato, grazie

risposta

5

La tecnica normale consiste nell'utilizzare una funzionalità del gestore memmory virtuale presente nella maggior parte dei cpus moderni.

Il modo in cui funziona l'hardware è che mantiene una lista di frammenti di memoria in una cache e un elenco degli indirizzi a cui corrispondono. Quando un programma tenta di leggere un po 'di memoria che non è presente in quella cache, la MMU non va solo a recuperare la memoria dalla ram principale, perché gli indirizzi nella cacher sono solo indirizzi "logici". Invece, richiama un altro programma che interpreterà l'indirizzo e recupererà quella memoria da dovunque dovrebbe essere.

Quel programma, chiamato un cercapersone, viene fornito dal kernel e i flag speciali nella MMU impediscono la sovrascrittura del programma.

Se quel programma determina che l'indirizzo corrisponde alla memoria che il processo dovrebbe utilizzare, fornisce alla MMU l'indirizzo fisico nella memoria principale che corrisponde all'indirizzo logico richiesto dal programma utente, l'MMU lo recupera nel suo cache e riprende a eseguire il programma utente.

Se quell'indirizzo è un indirizzo "speciale", come per un file mappato in memoria, il kernel recupera la parte corrispondente del file nella cache e lascia che il programma venga eseguito insieme a esso.

Se l'indirizzo si trova nell'intervallo che appartiene al kernel, o se il programma non ha ancora assegnato quell'indirizzo a se stesso, il cercapersone solleva un SEGFAULT, uccidendo il programma.

Poiché gli indirizzi sono indirizzi logici, non indirizzi fisici, diversi programmi utente possono utilizzare gli stessi indirizzi logici per indicare diversi indirizzi fisici, il programma di pager del kernel e la MMU rendono tutto questo trasparente e automatico.

Questo livello di protezione non è disponibile su CPU meno recenti (come cpus 80286) e alcuni dispositivi a potenza molto bassa (come CPU CortexM3 o Attiny) perché non c'è MMU, tutti gli indirizzi su questi sistemi sono indirizzi fisici, con un 1-1 corrispondenza tra RAM e spazio indirizzo

+0

Significa MMU invece di VMU e CPU ARM senza MMU di solito hanno una MPU che consente di impostare alcune regioni di memoria (8 in ARM946E-S) con diritti di accesso per utente/kernel. – ninjalj

0

Quando un computer stivali up, inizia l'esecuzione di codice da qualche luogo ben noto. Questo codice alla fine finisce per caricare alcuni kernel del sistema operativo in memoria e passare il controllo ad esso. Il kernel del sistema operativo imposta quindi la mappa della memoria della CPU tramite un metodo specifico della CPU.

5

Lo "switch" è in realtà nel processore stesso. Alcune istruzioni sono disponibili solo in modalità kernel (a.k.a. ring 0 su i386). Passare dalla modalità kernel alla modalità utente è facile. Tuttavia, non ci sono molti modi per tornare alla modalità kernel. È possibile:

  • inviare un interrupt al processore
  • effettuare una chiamata di sistema.

In entrambi i casi, l'operazione ha l'effetto collaterale del trasferimento del controllo su un codice kernel affidabile.

0

e, per esempio, se il driver è in modalità kernel come fa OS gestisce la sua integrazione al sistema in modo non v'è un software dannoso aggiunto come un driver?

E 'in realtà dipende l'architettura del sistema operativo. Vi darò due esempi:

  1. kernel Linux: un codice di driver può essere molto potente. Il livello di protezione è il seguente:

a) Un driver può accedere a un numero limitato di simboli nel kernel, specificato utilizzando EXPORT_SYMBOL. I simboli esportati sono generalmente funzioni. Ma nulla impedisce al driver di distruggere un kernel usando i puntatori wild. E la sicurezza che utilizza EXPORT_SYMBOL è nominale.

b) Un driver può essere caricato solo dall'utente privilegiato che dispone dell'autorizzazione root sulla casella. Quindi finché i privilegi di root non vengono violati il ​​sistema è sicuro.

  1. Micro-kernel come QNX: il sistema operativo esporta un'interfaccia sufficiente all'utente in modo che un driver possa essere implementato come un programma spaziale utente. Quindi il driver almeno non può facilmente distruggere il sistema.
Problemi correlati