임베디드 Linux - 가상 커널 메모리가 물리적 메모리보다 큰 이유는 무엇입니까?

임베디드 Linux - 가상 커널 메모리가 물리적 메모리보다 큰 이유는 무엇입니까?

저는 ARM 기반 시스템(두 개의 A7이 있음)에서 사용자 정의 Linux 배포판을 실행하고 있습니다.

Linux 커널 버전은 4.86.9입니다.

tar 또는 gzip과 같이 메모리 집약적인 작업을 실행할 때 통합 모니터에서 발생하는 이상한 그래픽 결함을 조사하는 과정에서 dmesgLinux가 시스템 메모리(1GB DDR3L 중 620MB여야 함)를 어떻게 보는지 알아내려고 노력하고 있습니다. Yocto 메모리 레이아웃 구성).

dmesg표시되는 내용은 다음과 같습니다 .

Memory: 484008K/634880K available (5120K kernel code, 205K rwdata, 1476K rodata, 1024K init, 331K bss, 15704K reserved, 135168K cma-reserved, 0K highmem)
Virtual kernel memory layout:
        vector  : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
        vmalloc : 0xd7000000 - 0xff800000   ( 648 MB)
        lowmem  : 0xb0000000 - 0xd6c00000   ( 620 MB)
        pkmap   : 0xafe00000 - 0xb0000000   (   2 MB)
        modules : 0xaf000000 - 0xafe00000   (  14 MB)
          .text : 0xb0008000 - 0xb0600000   (6112 kB)
          .init : 0xb0800000 - 0xb0900000   (1024 kB)
          .data : 0xb0900000 - 0xb0933468   ( 206 kB)
          .bss  : 0xb0935000 - 0xb0987e8c   ( 332 kB)

뭔가 잘못된 것 같습니다:

  1. 사용 가능한 메모리는 484MB/634MB에 불과합니다. 484MB도 634MB도 나에게는 의미가 없습니다.
  2. vmalloc최대 648MB.

이러한 가치를 이해하도록 도와주실 수 있나요?

나는 지적했다높은 메모리Yocto 구성에 따라 비활성화됩니다.

비활성화하기 전에는 위에서 언급한 대로 사용량이 여전히 0K였지만 표시되는 레이아웃은 dmesg약간 달랐습니다.

Memory: 484720K/634880K available (5120K kernel code, 197K rwdata, 1428K rodata, 1024K init, 256K bss, 14992K reserved, 135168K cma-reserved, 0K highmem)
Virtual kernel memory layout:
        vector   : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap   : 0xffc00000 - 0xfff00000   (3072 kB)
        vmalloc  : 0xe7000000 - 0xff800000   ( 392 MB)
        lowmem   : 0xc0000000 - 0xe6c00000   ( 620 MB)
        pkmap    : 0xbfe00000 - 0xc0000000   (   2 MB)
        modules  : 0xbf000000 - 0xbfe00000   (  14 MB)
           .text : 0xc0008000 - 0xc0600000   (6112 kB)
           .init : 0xc0800000 - 0xc0900000   (1024 kB)
           .data : 0xc0900000 - 0xc09314d8   ( 198 kB)
           .bss  : 0xc0933000 - 0xc09732d8   ( 257 kB)

보시 vmalloc다시피 392MB로 648MB의 절반에 불과합니다!

미리 감사드리며 중요한 내용을 놓친 경우 양해해 주시기 바랍니다.

답변1

이것이 바로 가상 메모리입니다. 즉, 물리적 메모리(및 기타 항목)를 완전히 별도의 메모리 공간에 매핑하는 것입니다.

이는 임베디드 장치나 Linux에만 국한되지 않습니다. 이것이 가상 메모리입니다.

해당 메모리 공간은 실제 메모리보다 크거나 작을 수 있습니다. 문제 없습니다. 각 프로세스의 가상 메모리 공간에 있는 모든 주소가 무언가에 매핑되어야 한다는 규정은 없습니다.

관련 정보