"Output of dmesg"를 통해 제대로 이해할 수없는 값 목록을 볼 수있었습니다.
Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
값에서 나는 2GB RAM (물리적 메모리)을 가지고 있음을 이해합니다. 하지만 나머지는 저에게 매직 넘버 인 것 같습니다.
각 항목 (fixmap, pkmap 등)에 대해 간략히 알고 싶습니다 (의심이 더 많으면 각 항목을 별도의 질문으로 게시하겠습니다)?
누군가 나에게 그것을 설명 할 수 있습니까?
먼저 32 비트 시스템은 0xffffffff
(4'294'967'295
) RAM 상단의 물리적 위치에 액세스하기위한 선형 주소.
커널은 이러한 주소를 사용자와 커널 공간으로 나눕니다.
사용자 공간 (높은 메모리)은 사용자가 액세스 할 수 있으며 필요한 경우 커널에서도 액세스 할 수 있습니다.
16 진수 및 10 진수 표기법의 주소 범위 :
0x00000000 - 0xbfffffff
0 - 3'221'225'471
커널 공간 (메모리 부족)은 커널에서만 액세스 할 수 있습니다.
16 진수 및 10 진수 표기법의 주소 범위 :
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 페이지 매핑이 할당됩니다.
토끼 구멍에 더 깊이 들어가고 싶다면 :
리눅스 커널 이해