우선, 32 비트 시스템에는 RAM의 물리적 위치에 액세스하기위한 0xffffffff
( 4'294'967'295
) 선형 주소가 있습니다.
커널은이 주소를 사용자 공간과 커널 공간으로 나눕니다.
사용자 공간 (높은 메모리)은 사용자가 필요하거나 필요한 경우 커널을 통해 액세스 할 수 있습니다.
16 진수 및 12 월 표기법의 주소 범위 :
0x00000000 - 0xbfffffff
0 - 3'221'225'471
커널 공간 (메모리 부족)은 커널에서만 액세스 할 수 있습니다.
16 진수 및 12 월 표기법의 주소 범위 :
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
이처럼 :
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
따라서, 본 메모리 레이아웃 dmesg
은 커널 공간에서 선형 주소의 매핑 에 해당합니다.
먼저 커널 자체 페이지 테이블의 초기화를 제공하는 .text, .data 및 .init 시퀀스 (물리적 주소로 선형 변환)
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
커널 코드가있는 범위입니다.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
커널 데이터 세그먼트가있는 범위입니다.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
커널의 초기 페이지 테이블이 상주하는 범위입니다.
(일부 동적 데이터 구조의 경우 다른 128kB)
이 최소 주소 공간은 RAM에 커널을 설치하고 핵심 데이터 구조를 초기화 할 수있을만큼 큽니다.
사용 된 크기는 괄호 안에 표시됩니다 (예 : 커널 코드).
0xc071ae6a - 0xc0400000 = 31AE6A
십진 표기법에서는 3'255'914
(3179 kB)입니다.
둘째, 초기화 후 커널 공간 사용
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
커널은 lowmem 범위를 사용하여 물리적 주소에 직접 액세스 할 수 있습니다.
커널은 비 연속 메모리 할당 및 수정 매핑 된 선형 주소를 구현하기 위해 항상 최소 128MB의 선형 주소를 필요로하기 때문에 전체 1GB가 아닙니다.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
가상 메모리 할당은 비 연속 구성표를 기반으로 페이지 프레임을 할당 할 수 있습니다. 이 스키마의 주요 장점은 외부 조각화를 피하는 것입니다. 이는 스왑 영역, 커널 모듈 또는 일부 I / O 장치에 버퍼 할당에 사용됩니다.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
영구적 인 커널 매핑을 통해 커널은 고용량 메모리 페이지 프레임을 커널 주소 공간으로 오래 사용할 수 있습니다. kmap ()를 사용하여 HIGHMEM 페이지를 매핑하면 여기에서 가상 주소가 할당됩니다.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
이들은 고정 매핑 된 선형 주소로, lowmem 주소와 같은 마지막 1GB뿐만 아니라 RAM의 모든 물리적 주소를 나타낼 수 있습니다. 수정 매핑 된 선형 주소는 lowmem 및 pkmap 동료보다 약간 더 효율적입니다. 고정 맵핑에 지정된 전용 페이지 테이블 디스크립터가 있으며 kmap_atomic을 사용하는 HIGHMEM 페이지의 맵핑이 여기에서 할당됩니다.
토끼 구멍에 대해 자세히 알아 보려면
Linux 커널 이해