64 비트 Linux 커널에서 커널에 의해 연속적으로 매핑되는 메모리 양은 얼마입니까?
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 비트 커널의 경우 얼마나 비 연속적인지에 대해 혼란 스럽습니다.
답변
아무 없습니다 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 미만) 및 나중에로드 된 모듈에 의해 잠긴 메모리.