Nel kernel Linux a 64 bit, quanta memoria è mappata in modo contiguo dal kernel?
Ho esaminato Linux Kernel Development di Robert Love e altre fonti. E ovunque si menziona che su un sistema x86 a 32 bit il kernel possiede il primo GB di spazio degli indirizzi virtuali, di cui fino a 896 MB viene mappato in modo contiguo sulla memoria fisica (chiamata ZONE_NORMAL) il resto è mappato nel restante 128 MB di spazio come richiesto e potrebbe non essere contiguo (ZONE_HIGHMEM).
Su 64 bit, viene eliminato il problema di non avere abbastanza spazio di indirizzi virtuali. E la mappa della memoria è descritta come,
0xffffffffffffffff +-----------+
| |
| | Kernelspace
| |
0xffff800000000000 +-----------+
| |
| |
| hole |
| |
| |
0x00007fffffffffff +-----------+
| |
| | Userspace
| |
0x0000000000000000 +———————————+
Tuttavia, non è chiaro, in questa mappa, quanta parte dello spazio del kernel deve essere fisicamente contigua (come definito in ZONE_NORMAL). e quanto è mappato come richiesto.
ZONE_HIGHMEM nel kernel a 64 bit è sempre 0? Poiché tutta la memoria è abbastanza all'interno del raggio dello spazio degli indirizzi virtuali?
Ma anche la memoria contigua fissa del kernel (che non è paginabile) richiederebbe di essere piccola, poiché quel pezzo di memoria fisica non sarebbe mai disponibile per altri processi utente. Quindi il kernel richiederebbe di utilizzare memoria che non deve essere contigua (come ZONE_HIGHMEM), come richiesto. Ciò è in conflitto con ZONE_HIGHMEM vuoto sui kernel a 64 bit.
Quindi sono confuso su quanto dello spazio del kernel è fissato fisicamente contiguo e quanto è non contiguo nel caso di kernel a 64 bit.
Risposte
Non c'è HIGHMEM
x86 a 64 bit - CONFIG_HIGHMEMdipende daX86_32 .
Esistono due mappature fisse della memoria fisica su x86 a 64 bit :
ffff888000000000 | -119.5 TB | ffffc87fffffffff | 64 TB | direct mapping of all physical memory (page_offset_base)
e l'area a partire da
ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | kernel text mapping, mapped to physical address 0
(gli indirizzi negativi sono offset dalla fine dello spazio degli indirizzi).
Quest'ultimo corrisponde a ciò a cui stai pensando, per quanto ne so, e tende ad essere piccolo; vedere la riga "Memoria" visualizzata durante l'avvio:
Memory: 20144992K/20660008K available (14339K kernel code, 2406K rwdata, 8340K rodata, 2488K init, 5116K bss, 515016K reserved, 0K cma-reserved)
(poco meno di 30MiB) e l'eventuale memoria bloccata dai moduli caricati successivamente.