512M 메모리는 어디에서 왔습니까?

512M 메모리는 어디에서 왔습니까?

가상 머신 Kali에서는 이렇게 4G 메모리를 할당했습니다.메모리 상태

하지만 문제가 있습니다. 메모리를 해킹하기 위해 게스트에 자체 구축 커널을 설치했습니다.

# 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

아래와 같이 메모리가 끝나는 영역을 보고 싶습니다. 기억을 바라보며

메모리 크기는 16*0x336000바이트라고 나와 있습니다. 그런 다음 결과를 기반으로 호스트의 메모리 크기를 추정했습니다.

$ 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

게스트에게 4G의 메모리를 줬는데, 위 상황에 따르면 4.5GiB가 되네요. 스왑은 1G이므로 이것은 쓰레기입니다.

0.5G 메모리는 어디서 나오나요? ? ? ?

답변1

RAM용으로 구축된 물리적 메모리 공간은 반드시 연속적일 필요는 없으며 RAM만이 물리적 주소를 얻는 유일한 것도 아닙니다. 컴퓨터에는 메모리 매핑된 버스/장치가 있습니다.

cat /proc/iomem장치와 실제 메모리 공간 매핑을 살펴 보세요 . lsmem실제 주소 공간 매핑이 크게 단순화되었습니다!

이것은 결코 Linux에만 국한된 것이 아닙니다. 거의 모든 현대 컴퓨터 아키텍처가 이런 방식으로 작동합니다.

이제 귀하의 특정한 경우에 귀하가 보고 있는 추가 "실제 RAM"은 실제로는 아니지만 하이퍼바이저와 VM 간의 통신에 사용되는 캡처된 주소인 것 같습니다.

답변2

출력에는 lsmem4개의 메모리 블록, 즉 블록 28-31이 "누락"된 것으로 표시됩니다. 메모리 블록 크기는 128M이고 총 크기는 512M입니다. 이 4개의 블록은 "추가" 메모리를 차지합니다. lsmem이는 사용 가능한 메모리로 보고되지 않습니다. 그렇다면 이러한 메모리는 무엇이며 어디서 오는 것입니까?

메모리의 공백에 해당하는 주소는 IO 메모리입니다. ~에 따르면오래되었지만 여전히 관련성이 있는 HOWTO,

iomem을 사용하는 카드를 삽입하면 실제로는 주 메모리용 메모리 모듈도 삽입됩니다. [...] 공유 메모리는 IO 주소 공간이 장치와 CPU 간에 공유되는 것처럼 장치와 CPU(장치 드라이버 실행) 간에 공유됩니다. 이 공유 메모리는 장치와 주 메모리 간의 데이터 "전송" 수단 역할을 합니다.

출력을 검사 # cat /proc/iomem하면 어떤 장치의 실제 메모리가 기본 주소 공간에 매핑되어 있는지 확인할 수 있습니다.

관련 정보