물리적 메모리는 커널 공간에 어떻게 매핑됩니까?

물리적 메모리는 커널 공간에 어떻게 매핑됩니까?

커널에서 물리적으로 연속적인 대규모 RAM 버퍼를 유지해야 하며 하드코딩된 물리적 주소를 읽고 쓸 수 있어야 합니다. 총 512MB RAM이 있는데 그 중 응용프로그램용으로 300-400MB를 예약해야 합니다.

나는 사용자 공간에서 이 메모리에 접근하기 위한 인터페이스로 UIO 드라이버를 작성했습니다. 아래와 같이 물리적 주소를 장치 트리에 매핑했습니다.

    uio_mem: uiomem {
       compatible = "ti,uio-module-drv";
       mem = <0x8000000 0x17C00000>;
    };

하지만 100MB 이상의 메모리에 액세스할 수 없습니다.

아래는 내 더미 매핑입니다.

Memory: 486136K/524288K available (6311K kernel code, 271K rwdata, 1948K rodata, 1024K init, 223K bss, 21768K reserved, 16384K cma-reserved, 0K highmem)
Virtual kernel memory layout:
vector  : 0xffff0000 - 0xffff1000   (   4 kB)
fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
vmalloc : 0xe0800000 - 0xff800000   ( 496 MB)
lowmem  : 0xc0000000 - 0xe0000000   ( 512 MB)
pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
modules : 0xbf000000 - 0xbfe00000   (  14 MB)
  .text : 0xc0008000 - 0xc0910dc4   (9252 kB)
  .init : 0xc0a00000 - 0xc0b00000   (1024 kB)
  .data : 0xc0b00000 - 0xc0b43e10   ( 272 kB)
   .bss : 0xc0b43e10 - 0xc0b7ba64   ( 224 kB) code here

512MB의 실제 메모리에 액세스하기 위해 이 가상 메모리 맵이 어떻게 구성되는지 자세히 설명할 수 있는 사람이 있습니까?

일련의 문의사항이 있는데,

  1. 커널 맵은 0xc0b43e10에서 시작하여 0xffff1000(거의 1GB)에서 끝납니다. 하지만 내 메모리는 512MB밖에 없는데 어떻게 이 가상 지도에 들어갈 수 있을까요?

  2. 사용자 공간에서 직접 주소를 사용하여 실제 메모리에 액세스할 수 있습니까? 그렇다면 액세스할 수 있는 최대 메모리 크기는 얼마입니까? 그리고 그것을 아는 방법.

답변1

mem=48M커널에서 사용하는 물리적 RAM의 양을 제한하기 위해 커널 매개변수(예를 들어)를 성공적으로 사용했습니다 . 그런 다음 메모리 매핑이 필요한 커널 드라이버의 나머지 RAM을 사용할 수 있습니다.

커널 문서를 참조하세요Documentation/memory.txt

관련 정보