Na máquina virtual Kali, atribuí a memória 4G, assim;
Mas há um problema. Instalei o kernel de autoconstrução no convidado para hackear a memória.
# uname -a
Linux 15ud490-gx76k 6.8.4+ #8 SMP PREEMPT_DYNAMIC Sat Apt 6 15:49:20 KST 2024 x86_64 x86_64 x86_64 GNU/Linux
E quero ver uma área de fim de memória, digitada como abaixo.
Diz que o tamanho da memória é 16*0x336000 bytes. Então inferi o tamanho da memória com os resultados (no host).
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 16*0x07fff0
8388352
>>> 16*0x07fff0/1024/1024
7.999755859375
>>> 16*0x335ff0/1024/1024
51.374755859375
>>> 16*0x336000/1024/1024
51.375
>>> 521000/1024/1024
0.49686431884765625
>>> (1024*1024*4+521000+3288)*1024/1024/1024/1024 # Convert into gigabytes
4.5
Dei a memória 4G para convidado mas ela tem 4,5GiB conforme acima. A troca é 1G, então é um absurdo.
Onde está a fonte de memória 0,5G ?????
Nem o espaço de memória física construído para sua RAM é necessariamente contíguo, nem a RAM é a única coisa que obtém endereços físicos: seu computador possui barramentos/dispositivos mapeados em memória.
Tente
cat /proc/iomem
ver o mapeamento dos dispositivos para o espaço de memória física.lsmem
simplifica muito o que é realmente o mapeamento do espaço de endereço!Isso não é de forma alguma específico do Linux: é assim que funcionam praticamente todas as arquiteturas de computadores modernas.
Agora, no seu caso específico, acho que a "verdadeira RAM" extra que você vê não é isso, mas endereços presos usados para comunicação entre o hipervisor e a VM.
Sua saída
lsmem
mostra 4 blocos de memória "ausentes", ou seja, os blocos 28-31. O tamanho do bloco de memória é 128M, totalizando um tamanho total de 512M. Esses 4 blocos representam sua memória “extra”.lsmem
não os relata como memória utilizável, então o que são e de onde vieram?Os endereços correspondentes à lacuna na sua memória são memória IO. De acordo com este HOWTO antigo, mas ainda relevante ,
Verifique a saída de
# cat /proc/iomem
e você verá quais dispositivos têm sua memória física mapeada no espaço de endereço principal.