나는 스왑에 대해 알고 있습니다. 이 질문은 그것과 아무 관련이 없습니다. dmesg에서 Linux(x86-64) 커널은 내가 가지고 있는 메모리 양에 대한 정보를 알려줍니다.
[ 0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)
cat /proc/meminfo
내가 가지고 있다고 말해줘
MemTotal: 3910472 kB
내 계산에 따르면 4*1024*1024=4194304k RAM이 있어야 한다고 생각합니다. 이것은방법위 dmesg 줄의 두 번째 숫자보다 작습니다!
이 다른 숫자에는 무슨 일이 일어나고 있는 걸까요?
그런데 uname -a
출력은 다음과 같습니다.
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
답변1
dmesg
"Memory Akb/Bkb Available" 값을 다음과 같이 읽어야 합니다 .
이제 A를 사용할 수 있습니다. 시스템의 가장 높은 페이지 프레임 수에 페이지 크기를 곱한 값은 B입니다.
출처 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()
커널에서 현재 사용하지 않는 물리적 메모리의 양을 반환합니다. max_pfn
가장 높은 페이지 프레임 번호입니다( PAGE_SHIFT
이동하면 kb로 변환됩니다). 가장 높은 페이지 프레임 번호는 예상보다 (훨씬) 높을 수 있습니다. BIOS에서 수행한 메모리 매핑에는 구멍이 포함될 수 있습니다.
이러한 구멍이 차지하는 양은 absent_pages
으로 표시된 변수에 의해 추적됩니다 kB absent
. 이는 "사용 가능" 출력의 두 번째 숫자와 설치된 실제 RAM 간의 대부분의 차이점을 설명합니다.
이러한 취약점을 "확인"하기 BIOS-e820
위해 grep을 사용할 수 있습니다 . dmesg
메모리 맵이 여기에 표시됩니다( dmesg
시작 후 출력 상단). 실제 사용 가능한 RAM이 있는 물리적 주소를 확인할 수 있어야 합니다.
(다른 x86 문제와 예약된 메모리 영역이 나머지를 설명할 수 있습니다. 자세한 내용은 모르겠습니다.)
MemTotal
in은 /proc/meminfo
RAM을 사용할 수 있음을 나타냅니다. 부팅 시퀀스가 끝나면 커널은 init
더 이상 필요하지 않은 데이터를 해제하므로 보고된 값은 /proc/meminfo
부팅 시퀀스의 초기 부분에서 커널이 인쇄한 값보다 약간 높을 수 있습니다.
( 이 디스플레이에 meminfo
간접적으로 totalram_pages
사용됩니다. x86_64의 경우 NUMA가 아닌 코어 에 대해서도 자체적 으로 계산 arch/x86/mm/init_64.c
됩니다 .)free_all_bootmem()
mm/bootmem.c