저는 Linux 운영 체제의 기본을 이해하려고 노력하고 있습니다. 저는 64비트 CPU에서 64비트 Ubuntu 12.04를 실행하고 있습니다. 시스템에는 2GB RAM이 있습니다.
cat /proc/meminfo
MemTotal: 2012040 kB
질문 1: 누락된 85112KB 메모리는 어디에 있나요?
2097152 (2 gb in kilobytes)
2012040 -
______________
85112
이것은 다른 목적으로 예약되어 있습니까? 아니면 시스템이 사용할 수 없는 4% RAM의 하드웨어 제한이 있습니까?
질문 2: 처음 읽었을 때 사용자 커널 공간이 3:1로 분할되어 있다고 들었습니다. 여기서는 왜 그렇지 않습니까?
(3/4)*2097152 =1572864 for user space
(1/4)*2097152 =524288 for kernel space
나는 Linux RAM 캐시와 버퍼에 대해 알고 있지만(적어도 그것을 이해하기 위해 약간의 연구 노력을 기울였습니다), 이 사례는 그것과 아무 관련이 없습니다. 그렇다면 무슨 일이 일어나고 있습니까?
답변1
동시에 두 가지 질문을 해서는 안 되지만...
질문 1
이 메모리 중 일부는 커널 코드 자체에 사용되고 일부는 예약되어 있습니다. 커널은 시스템 부팅 메시지에 이를 표시합니다.
[ 0.000000] Memory: 6106920k/7340032k available (3633k kernel code, 1057736k absent, 175376k reserved, 3104k data, 616k init)
"존재하지 않음" 줄은 실제로 존재하지 않는 메모리입니다(머신에 현재 6GiB의 RAM이 설치되어 있음). 커널은 또한 메모리 맵을 인쇄합니다(이것은 부팅 메시지의 이전 부분입니다):
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e2c00-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bf77ffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000bf780000-0x00000000bf797fff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x00000000bf798000-0x00000000bf7d9fff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000bf7da000-0x00000000bfffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000001bfffffff] usable
그런 다음 커널은 맵에 대한 다양한 복구를 수행하여 일반적으로 더 많은 메모리를 유지합니다. 특히 드라이버가 로드될 때.
질문 2
커널/사용자 부문은 다음과 같습니다.가상 주소 공간, 기억이 아닙니다. 작업할 주소 공간이 너무 많기 때문에 64비트 시스템에서는 거의 관련이 없습니다.
32비트 시스템에서는 가상 주소 0x00000000–0xBFFFFFFFF가 사용자 주소 공간으로 사용됩니다. 0xC0000000–0xFFFFFFFF는 커널에서 사용됩니다(3:1 분할이고 다른 옵션에는 2:2 분할이 포함됩니다. 이 숫자는 GB 단위이므로 1:1이 아닌 2:2입니다). 가상 주소는 프로세스별로도 다릅니다(각 프로세스는 0x00001000에 페이지를 가질 수 있으며 이는 다른 페이지입니다).
그러나 가상 주소는 메모리 바이트에 해당하지 않습니다. 기본적으로 다음 네 가지로 지원될 수 있습니다.
- 아무것도 없습니다. 이 페이지는 사용되지 않습니다. 액세스하려고 하면 세그폴트가 발생합니다.
- 물리적 메모리. MMU는 가상 주소를 실제로 어딘가에 있는 DIMM의 커패시터에 해당하는 물리적 주소로 변환합니다.
- 스왑(또는 메모리 매핑 파일). 액세스하면 페이지 오류가 발생하고 커널은 데이터를 메모리로 읽는 동안 프로세스를 중단합니다(그리고 공간을 확보하기 위해 다른 데이터를 디스크에 쓸 수도 있습니다). 그런 다음 커널은 페이지 테이블을 업데이트하여 이를 사례 #2로 바꿉니다.
- 페이지가 없습니다. 새로 할당된 페이지로 아직 사용되지 않은 페이지입니다. 그렇게 되면 커널은 물리적 메모리 페이지를 찾아(아마도 다른 것으로 교체) 이를 0으로 채운 다음(안전을 위해) 사례 #2입니다.
투명한 거대한 페이지는 더 많은 상황을 가능하게 합니다. 제가 잊어버린 덜 중요한 것들이 있을 수도 있습니다...
어쨌든 내 64비트 칩의 가상 주소 크기는 48비트입니다. 커널이 어떤 분할을 사용하는지 잘 모르겠지만 그 절반도 47비트 공간으로 36비트 물리적 주소 크기를 훨씬 초과합니다. 그리고 131,072 GiB의 RAM은 너무 비쌉니다... (그리고 64가 더 저렴해지면 여전히 많은 비트가 남아 있으며 향후 프로세서에서는 더 많은 비트를 허용할 수도 있다는 점을 기억하십시오).
답변2
하드웨어 예약은 소량의 RAM을 차지하며, 특히 온보드 그래픽 카드가 자체 작업을 위해 일부 RAM을 사용해야 하는 경우 더욱 그렇습니다. 이는 모든 운영 체제에서 발생합니다.