Per quanto riguarda il kernel Linux, le pagine del "Kernel" vengono mai sostituite? Inoltre, le pagine spaziali degli utenti possono risiedere in ZONE_NORMAL?Le pagine del kernel vengono scambiate?
risposta
No, la memoria del kernel non è possibile.
Le pagine del kernel non sono scambiabili. Ma può essere liberato.
Le pagine Spazio utente possono risiedere in ZONE_NORMAL. Sistema Linux Può essere configurato per utilizzare HIGHMEM o meno. Se ZONE_HIGHMEM è configurato, i processi dello spazio utente recupereranno la memoria da HIGHMEM altrimenti i processi dello spazio utente recupereranno memoria da ZONE_NORMAL.
Sì, in circostanze normali non sono intercambiabili, infatti, una volta rilevate le pagine del kernel (vale a dire, la memoria residente nel kernel per l'utilizzo del kernel) (vedere il codice pagefault fonte handler), il kernel in modo esplicito in crash se stessa .
vedere questo:
http://lxr.free-electrons.com/source/arch/x86/mm/fault.c
e la funzione:
1205 /*
1206 * This routine handles page faults. It determines the address,
1207 * and the problem, and then passes it off to one of the appropriate
1208 * routines.
1209 *
1210 * This function must have noinline because both callers
1211 * {,trace_}do_page_fault() have notrace on. Having this an actual function
1212 * guarantees there's a function trace entry.
1213 */
1214 static noinline void
1215 __do_page_fault(struct pt_regs *regs, unsigned long error_code,
1216 unsigned long address)
1217 {
e la rilevazione qui:
1246 *
1247 * This verifies that the fault happens in kernel space
1248 * (error_code & 4) == 0, and that the fault was not a
1249 * protection error (error_code & 9) == 0.
1250 */
1251 if (unlikely(fault_in_kernel_space(address))) {
1252 if (!(error_code & (PF_RSVD | PF_USER | PF_PROT))) {
1253 if (vmalloc_fault(address) >= 0)
1254 return;
1255
1256 if (kmemcheck_fault(regs, address, error_code))
1257 return;
1258 }
Ma lo stesso gestore pagefault - in grado di rilevare pagefault derivanti dalla memoria usermode inesistente (tutti i parametri di default delle pagine hardware) sempre nel kernel) recupera esplicitamente i dati dallo spazio di swap se esiste, oppure avvia una routine di allocazione della memoria per dare al processo più memoria.
Ok, detto questo, il kernel fa scambiare le strutture del kernel/memoria/tasklists etc durante il software di sospensione e ibernazione funzionamento:
https://www.kernel.org/doc/Documentation/power/swsusp.txt
E durante la fase di ripresa si ripristinerà indietro la memoria del kernel da scambio file.
E le pagine assegnate dai driver? –