2014-08-20 17 views
6

I driver per i kernel monolitici possono essere negli anelli 0, 1 o 2 (con microkernel saranno nell'anello 3 - anello utente).C'è un vantaggio nel mettere il codice del driver x86 negli anelli 1 e 2 invece di 0?

Ci sono vantaggi/svantaggi nel mettere il codice del driver nell'anello 0 con il kernel o negli anelli 1 e 2 privilegiati "leggermente-meno"?

anelli 1 e 2 possono ancora accedere alle pagine di supervisione, ma non possono eseguire alcune istruzioni privilegiate speciali (se lo fanno, si alzerà un errore di protezione generale - come con anello 3)

risposta

5

Il vantaggio più evidente di utilizzare gli anelli 1 e 2 rappresenterebbero una separazione architettonica che potrebbe proteggere il kernel da un driver di dispositivo difettoso. In teoria, un kernel scritto correttamente consentirebbe un errore grazioso quando un driver in un anello esterno ha un errore catastrofico. L'esecuzione di un driver nell'anello 0 potrebbe consentire potenzialmente di rimuovere l'intero kernel se non riesce.

Uno svantaggio di spostare i driver negli anelli 1 e 2 sarebbe un sovraccarico delle prestazioni correlato alla costante necessità di transizioni di anello tra il kernel e i driver. Ovviamente, in un sistema microkernel, this is necessary and could be sufficiently fast depending on your needs. Con le opportune ottimizzazioni, separare il kernel dai suoi servizi può avere un impatto molto piccolo sulle prestazioni. Detto questo, le istruzioni Intel SYSENTER/SYSEXIT (e equivalente AMD SYSCALL/SYSRET) utilizzate per la commutazione rapida del contesto solo consentono transizioni tra gli anelli 0 e 3; per eseguire un cambio di contesto dentro o fuori dagli anelli 1 o 2, è richiesto un interrupt completo.

più Uno svantaggio da considerare è che perché molte altre architetture hanno solo modalità supervisore e utente (o equivalente) qualsiasi architettura piattaforma scrivere che gestisce quali elementi la corsa del codice livello al dovranno entrambi:

  • essere scritto in modo diverso a seconda che la piattaforma abbia gli squilli 1 e/o 2 e
  • prendere una decisione diversa su quale livello di privilegio il codice ha a seconda della piattaforma.

Se si sta pianificando di costruire un sistema che sarà costruito per architetture diverse, ciò potrebbe portare ad alcune difficoltà.

+1

Si noti inoltre che l'impaginazione ha solo "utente" e "supervisore". Qualsiasi codice ring 1 o ring 2 può accedere a pagine "supervisor" (ad esempio, pagine del kernel di trash ring 0); e quindi c'è poco da fare usando l'anello 1 o l'anello 2, o devi usare la segmentazione per garantire la protezione e non il paging (che è una pessima idea per le prestazioni) – Brendan