it-swarm-ko.tech

dmesg의 가상 커널 메모리 레이아웃은 무엇을 의미합니까?

"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 등)에 대해 간략히 알고 싶습니다 (의심이 더 많으면 각 항목을 별도의 질문으로 게시하겠습니다)?

누군가 나에게 그것을 설명 할 수 있습니까?

19
Sen

먼저 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 페이지 매핑이 할당됩니다.


토끼 구멍에 더 깊이 들어가고 싶다면 :
리눅스 커널 이해

22
wag