GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:perché Linux mostra sia più che meno memoria di quella che ho installato fisicamente?

Conosco lo scambio:questa domanda non riguarda questo. In dmesg, il kernel Linux (x86-64) mi dice quanta memoria ho:

[    0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)

cat /proc/meminfo mi dice che ho

MemTotal:        3910472 kB

E secondo i miei calcoli, penso che dovrei avere esattamente 4*1024*1024=4194304k di RAM. Che è modo inferiore alla seconda cifra nella riga dmesg sopra!

Che cosa sono tutte queste diverse figure?

A proposito, uname -a uscite:

Linux pavilion 3.2.2-1.fc16.x86_64 #1 SMP Thu Jan 26 03:21:58 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Risposta accettata:

Dovresti leggere il dmesg valori “Memoria Akb/Bkb disponibile” come:

Al momento è disponibile A per l'uso e il numero di frame di pagina più alto del sistema moltiplicato per le dimensioni della pagina è B.

Questo proviene da arch/x86/mm/init_64.c :

printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
                 "%ldk absent, %ldk reserved, %ldk data, %ldk init)n",
                 nr_free_pages() << (PAGE_SHIFT-10),
                 max_pfn << (PAGE_SHIFT-10),
                 codesize >> 10,
                 absent_pages << (PAGE_SHIFT-10),
                 reservedpages << (PAGE_SHIFT-10),
                 datasize >> 10,
                 initsize >> 10);

nr_free_pages() restituisce la quantità di memoria fisica, gestita dal kernel, che non è attualmente in uso. max_pfn è il numero di frame della pagina più alto (il PAGE_SHIFT shift lo converte in kb). Il numero di frame di pagina più alto può essere (molto) superiore a quello che potresti aspettarti:la mappatura della memoria eseguita dal BIOS può contenere buchi.
Quanto occupano questi buchi è tracciato da absent_pages variabile, visualizzata come kB absent . Questo dovrebbe spiegare la maggior parte della differenza tra il secondo numero nell'output "disponibile" e la RAM installata effettiva.

Puoi grep per BIOS-e820 in dmesg per “vedere” questi buchi. La mappa della memoria viene visualizzata lì (proprio nella parte superiore di dmesg output dopo l'avvio). Dovresti essere in grado di vedere a quali indirizzi fisici hai una RAM reale e utilizzabile.
(Altre stranezze x86 e aree di memoria riservate probabilmente spiegano il resto, non conosco i dettagli lì.)

MemTotal in /proc/meminfo indica la RAM disponibile per l'uso. Proprio alla fine della sequenza di avvio, il kernel libera init dati non servono più, quindi il valore riportato in /proc/meminfo potrebbe essere leggermente superiore a quello che il kernel stampa durante le parti iniziali della sequenza di avvio.

Correlati:Elenco dei segnali generati dal terminale (ad es. Ctrl-C -> SIGINT)?

(meminfo utilizza indirettamente totalram_pages per quella visualizzazione. Per x86_64, questo è calcolato in arch/x86/mm/init_64.c anche tramite free_all_bootmem() che a sua volta è in mm/bootmem.c per kernel non NUMA.)


Linux
  1. Che cos'è un server Linux e perché la tua azienda ne ha bisogno?

  2. Perché Linux usa una partizione di swap piuttosto che un file?

  3. Cosa sono la memoria alta e la memoria bassa su Linux?

  4. quali processi killer ha Linux?

  5. Perché i numeri di chiamata del sistema Linux in x86 e x86_64 sono diversi?

Linux:un utente deve accedere per eseguire un processo e diventarne il proprietario?

Linux:cosa implica il layout della memoria del kernel virtuale in Dmesg?

Che cos'è il comando Grep in Linux? Perché viene utilizzato e come funziona?

La macchina virtuale con sistema operativo CentOS 5 a 32 bit non indirizza la memoria fisica superiore a 3 GB

6 motivi per cui Linux non ha più app

Perché top mostra un numero diverso di core rispetto a cpuinfo?