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

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

경험하다"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)

이 값을 보면 RAM(물리적 메모리)이 2GB라는 것을 알 수 있습니다. 하지만 나머지 것들은 나에게 마법의 숫자처럼 보입니다.

각 문제(fixmap, pkmap 등)에 대한 간략한 개요를 알고 싶습니다. 질문이 더 있으면 각 문제를 별도의 질문으로 게시하겠습니다.

누군가 나에게 이것을 설명해 줄 수 있습니까?

답변1

첫째, 32비트 시스템에는 RAM의 물리적 위치에 액세스하기 위한 0xffffffff( 4'294'967'295) 선형 주소가 있습니다.
커널은 이러한 주소를 사용자 공간과 커널 공간으로 나눕니다.

사용자 공간(더 높은 메모리)은 사용자가 액세스할 수 있으며 필요한 경우 커널이 액세스할 수 있습니다.
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

10진수 표기법으로는 3'255'914(3179kB)입니다.


2. 초기화 후 커널 공간 사용

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 커널에 대해 알아보기

관련 정보