64 비트 Linux 커널에서 커널에 의해 연속적으로 매핑되는 메모리 양은 얼마입니까?

Aug 21 2020

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 비트 커널의 경우 얼마나 비 연속적인지에 대해 혼란 스럽습니다.

답변

2 StephenKitt Aug 21 2020 at 11:44

아무 없습니다 HIGHMEM64 비트 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 미만) 및 나중에로드 된 모듈에 의해 잠긴 메모리.