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


19

"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 등) (더 의심이 든다면 각각을 별도의 질문으로 게시 할 것입니다)?

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

답변:


22

우선, 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 커널 이해


이 위대한 답변에 감사드립니다. 왜 낮은 mem이 1GB가 아니고 문장의 다음 부분에 대해 더 많은 이유를 알고 싶습니다. "커널은 비 연속적인 메모리 할당 및 수정 매핑 된 선형 주소를 구현하기 위해 항상 최소 128MB의 선형 주소가 필요하기 때문입니다."
Sen

커널 때때로 고 메모리 코드에 액세스해야합니다 (fe BIOS 및 ACPI 정보는 RAM의 첫 MB에 상주합니다). 메모리가 높은 선형 주소 인 경우 128MB는이 용도로만 예약되어 있습니다. vmalloc 영역은 대부분 임시 메모리 영역에 임시로 매핑되며 매우 빠르게 다시 매핑됩니다.
wag

따라서 가상 시스템 호출을 위해 커널이 설정 한 페이지도 fixmap의 일부입니까 ??? 주소가 fffb5000, fffa1000 등인 페이지에 정확히 무엇이 있는지 알고 싶기 때문에이 질문에 부딪 쳤습니다 ... 많은 가상 CPU 가이 페이지에 많이 액세스하기 때문에 가상 머신 레코드 재생에 오버 헤드가 발생합니다 ... 나는 정확히 그런데 ... 훌륭한 대답은 :)이 주소에 알
Deepthought
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.