저는 Robert Love의 Linux 커널 개발 및 기타 자료를 읽었습니다. 32비트 x86 시스템에서 커널은 가상 주소 공간의 상위 1GB를 소유하며, 이 중 최대 896MB는 물리적 메모리(ZONE_NORMAL이라고 함)에 연속적으로 매핑되고 나머지는 나머지 128MB에 매핑된다는 것이 모든 곳에서 언급됩니다. 필요에 따라 공간을 확보할 수 있으며 연속적이지 않을 수도 있습니다(ZONE_HIGHMEM).
64비트에서는 가상 주소 공간이 충분하지 않은 문제가 제거됩니다. 메모리 맵은 다음과 같이 설명됩니다.
0xffffffffffffffff +-----------+
| |
| | Kernelspace
| |
0xffff800000000000 +-----------+
| |
| |
| hole |
| |
| |
0x00007fffffffffff +-----------+
| |
| | Userspace
| |
0x0000000000000000 +———————————+
그러나 이 맵에서 (ZONE_NORMAL에 정의된 대로) 물리적으로 연속되기 위해 얼마나 많은 커널 공간이 필요한지는 명확하지 않습니다. 그리고 필요한 만큼 지도를 작성하세요.
64비트 커널에서는 ZONE_HIGHMEM이 항상 0입니까? 모든 메모리가 가상 주소 공간 범위 내에 있으므로?
그러나 커널의 고정된 연속 메모리(페이징 가능하지 않음)도 작아야 합니다. 해당 물리적 메모리 블록은 다른 사용자 프로세스에서 절대 사용할 수 없기 때문입니다. 따라서 커널은 필요에 따라 연속될 필요가 없는 메모리(예: ZONE_HIGHMEM)를 사용해야 합니다. 이는 64비트 커널에서 ZONE_HIGHMEM이 비어 있는 것과 충돌합니다.
그래서 커널 공간 중 물리적으로 연속적으로 고정된 공간이 얼마나 되는지, 64비트 커널의 경우 비연속적인 공간이 얼마나 되는지 혼란스럽습니다.
답변1
HIGHMEM
64비트 x86에서는 사용할 수 없음—CONFIG_HIGHMEM
에 의존한다X86_32
.
물리적 메모리에는 두 가지 고정 매핑이 있습니다.64비트 x86에서:
ffff888000000000 | -119.5 TB | ffffc87fffffffff | 64 TB | direct mapping of all physical memory (page_offset_base)
그리고 시작하는 지역은
ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | kernel text mapping, mapped to physical address 0
(음수 주소는 주소 공간 끝의 오프셋입니다.)
내가 아는 한, 후자는 여러분이 생각하는 대로 작동하며 시작하는 동안 표시되는 "메모리" 줄을 보면 매우 작은 경향이 있습니다.
Memory: 20144992K/20660008K available (14339K kernel code, 2406K rwdata, 8340K rodata, 2488K init, 5116K bss, 515016K reserved, 0K cma-reserved)
(30MiB 바로 아래) 및 나중에 로드된 모듈에 의해 잠긴 모든 메모리.