C'è un po 'in un registro che indica se la CPU è attualmente in modalità kernel o user mode. Il codice del programma non può modificare direttamente questo bit: deve usare istruzioni speciali che fanno molto più che modificare questo bit. Alcune istruzioni possono essere utilizzate solo in modalità kernel; il tentativo di utilizzarli in modalità utente attiva invece una trappola .
Mentre il processore è in esecuzione in modalità kernel, può passare alla modalità utente in qualsiasi momento. Ma mentre il processore è in esecuzione in modalità utente, ci sono solo alcuni modi per passare alla modalità kernel: con la chiamata di sistema istruzione, a causa di un'interruzione o di una trappola. In tutti i casi, il processore non passa semplicemente alla modalità kernel, ma salta anche a un indirizzo in memoria che può essere configurato solo dal codice del kernel. Ciò garantisce che il codice della modalità utente non possa eseguire ciò che vuole in modalità kernel. La modalità utente può solo chiamare alcuni punti di ingresso specifici nel codice del kernel, e il codice del kernel in questi punti di ingresso può configurare attentamente il suo ambiente di elaborazione e convalidare i suoi input.
Tutto ciò sarebbe inutile se il codice utente potesse modificare il contenuto della memoria che contiene codice o dati del kernel. Non è possibile a causa della unità di gestione della memoria (MMU) . Una delle funzioni della MMU è limitare la memoria accessibile in un dato momento. La memoria può essere contrassegnata come accessibile solo al kernel e il passaggio tra la modalità kernel e la modalità utente può modificare la tabella dei permessi di accesso. La configurazione della MMU può essere modificata solo durante l'esecuzione in modalità kernel. In questo modo il kernel può configurare la memoria in modo che possa accedere al proprio codice e ai propri dati, ma il codice utente non può.
Il kernel mantiene in realtà una configurazione MMU per processo utente. Prima di passare alla modalità utente, il kernel modifica la configurazione della MMU in modo che corrisponda a quella del processo che verrà eseguito dopo il passaggio alla modalità utente.
Praticamente qualsiasi processore sufficientemente avanzato segue questo modello di base: non solo qualsiasi PC prodotto negli ultimi 30 anni, ma anche qualsiasi smartphone e persino molti dispositivi incorporati.
Ho semplificato molte cose. Nel mondo reale, ci possono essere più di due livelli di privilegi, più modalità di processore, più aspetti della configurazione della MMU, ecc. Hai il succo di come funziona. Se vuoi capire il codice del kernel o scrivere il tuo, devi leggere su una specifica architettura del processore in modo più dettagliato.
La "modalità reale" è un aspetto storico dei processori x86. Non è stato rilevante nel mondo reale negli ultimi due decenni, tranne che in alcuni rari sistemi x86 incorporati e in alcune persone che scrivono bootloader o eseguono software legacy molto vecchi.