GNU/Linux >> Linux Esercitazione >  >> Linux

stack del kernel e stack dello spazio utente

  1. Qual ​​è la differenza tra stack del kernel e stack utente?

In breve, niente, a parte l'utilizzo di una posizione diversa in memoria (e quindi un valore diverso per il registro del puntatore dello stack) e solitamente diverse protezioni di accesso alla memoria. Cioè. durante l'esecuzione in modalità utente, la memoria del kernel (parte della quale è lo stack del kernel) non sarà accessibile anche se mappata. Viceversa, senza essere esplicitamente richiesto dal codice del kernel (in Linux, tramite funzioni come copy_from_user() ), la memoria utente (incluso lo stack utente) di solito non è direttamente accessibile.

  1. Perché viene utilizzato [ uno stack separato ] del kernel ?

Separazione dei privilegi e della sicurezza. Per prima cosa, i programmi in spazio utente possono rendere il loro stack (puntatore) tutto ciò che vogliono, e di solito non vi è alcun requisito architettonico per averne uno valido. Il kernel quindi non può fidarsi il puntatore dello stack dello spazio utente non sia valido né utilizzabile, e quindi richiederà un set sotto il proprio controllo. Diverse architetture di CPU lo implementano in modi diversi; Le CPU x86 commutano automaticamente i puntatori dello stack quando si verificano i cambi di modalità privilegio e i valori da utilizzare per diversi livelli di privilegio sono configurabili tramite codice privilegiato (ovvero solo il kernel).

  1. Se una variabile locale viene dichiarata in un ISR, dove verrà memorizzata?

Nello stack del kernel. Il kernel (il kernel di Linux, cioè) non collegare gli ISR ​​direttamente alle gate di interrupt dell'architettura x86 ma invece delega l'invio dell'interrupt a un comune meccanismo di entrata/uscita dell'interrupt del kernel che salva lo stato del registro pre-interrupt prima di chiamare il/i gestore/i registrato/i. La CPU stessa durante l'invio di un interrupt potrebbe eseguire un privilegio e/o un cambio di stack, e questo viene utilizzato/impostato dal kernel in modo che il codice di immissione dell'interrupt comune possa già fare affidamento sulla presenza di uno stack del kernel.
Detto questo, gli interrupt che si verificano durante l'esecuzione del codice del kernel continueranno semplicemente a utilizzare lo stack del kernel in quel punto. Questo può, se i gestori di interrupt hanno percorsi di chiamata profondamente nidificati, portare a overflow dello stack (se un percorso di chiamata profondo del kernel viene interrotto e il gestore causa un altro percorso profondo; in Linux, il codice RAID filesystem/software interrotto dal codice di rete con iptables attivo è noto per innescare tale in kernel più vecchi non ottimizzati ... la soluzione è aumentare le dimensioni dello stack del kernel per tali carichi di lavoro).

  1. Ogni processo ha il proprio stack del kernel?

Non solo ogni processo, ogni thread ha il proprio stack del kernel (e, di fatto, anche il proprio stack utente). Ricorda che l'unica differenza tra processi e thread (in Linux) è il fatto che più thread possono condividere uno spazio di indirizzi (formando un processo).

  1. In che modo il processo si coordina tra questi due stack?

Niente affatto - non è necessario. La pianificazione (come/quando vengono eseguiti diversi thread, come il loro stato viene salvato e ripristinato) è l'attività del sistema operativo e i processi non devono occuparsene. Man mano che i thread vengono creati (e ogni processo deve avere almeno un thread), il kernel crea gli stack del kernel per loro, mentre gli stack dello spazio utente vengono creati/forniti esplicitamente da qualunque meccanismo venga utilizzato per creare un thread (funzioni come makecontext() o pthread_create() consentire al chiamante di specificare una regione di memoria da utilizzare per lo stack del thread "figlio") o ereditata (tramite clonazione della memoria in accesso, solitamente chiamata "copia su scrittura" / COW, durante la creazione di un nuovo processo).
Detto questo, il processo può influenzare la programmazione dei suoi thread e/o influenzare il contesto (stato, tra cui c'è il puntatore dello stack del thread). Ci sono diversi modi per farlo:segnali UNIX, setcontext() , pthread_yield() / pthread_cancel() , ... - ma questo sta divagando un po' dalla domanda originale.


La mia risposta è raccolta da altre domande SO con i miei materiali.

What's the difference between kernel stack and user stack?

Come programmatore del kernel, sai che il kernel dovrebbe essere limitato da programmi utente errati. Supponiamo di mantenere lo stesso stack sia per il kernel che per lo spazio utente, quindi un semplice segfault nell'applicazione utente blocca il kernel e deve essere riavviato.

Esiste uno "stack del kernel" per CPU come lo stack ISR e uno "stack del kernel" per processo. Esiste uno "stack utente" per ogni processo, sebbene ogni thread abbia il proprio stack, inclusi sia i thread utente che quelli del kernel.

http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

Quindi, quando siamo in modalità kernel, è necessario un tipo di meccanismo di stack per gestire le chiamate di funzione, variabili locali simili allo spazio utente.

http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

Verrà archiviato nello stack ISR (IRQSTACKSIZE). L'ISR viene eseguito su uno stack di interrupt separato solo se l'hardware lo supporta. In caso contrario, i frame dello stack ISR vengono inseriti nello stack del thread interrotto.

Lo spazio utente non sa e francamente non si preoccupa se l'interruzione viene servita nello stack del kernel del processo corrente o in uno stack ISR separato. Poiché gli interrupt arrivano per cpu, quindi lo stack ISR deve essere per cpu.

 Does each process has its own kernel stack ?

Sì. Ogni processo ha il proprio stack del kernel.

 Then how the process coordinates between both these stacks?

La risposta di @FrankH mi sembra ottima.


Linux
  1. Utenti e Gruppi

  2. Ottenere il tempo dell'utente e del kernel di un processo in esecuzione?

  3. Bash - Comando data e spazio

  4. Impedisci all'utente di digitare spazi accidentali tra rm e caratteri jolly

  5. AWK e nomi di file con spazio al suo interno.

Comandi Pushd e Popd in Linux

Comando Linux id - Stampa le informazioni sull'ID utente e sull'ID gruppo

Kernel Linux e le sue funzioni

Crea e configura un utente in MSSQL

Come eseguire il mmap di un buffer del kernel Linux nello spazio utente?

Qual è la differenza tra spazio utente e spazio kernel?