物理メモリはカーネル空間にどのようにマッピングされますか?

物理メモリはカーネル空間にどのようにマッピングされますか?

カーネル内の物理的に連続した大規模なRAMバッファを維持し、ハードコーディングされた物理アドレスを読み書きできる必要があります。合計512MBのRAMがあり、そのうちアプリケーション用に300〜400MBを予約する必要があります。

私はユーザースペースでこのメモリにアクセスするためのインターフェースとしてUIOドライバを作成しました。次のように、物理アドレスをデバイスツリーにマッピングしました。

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

ただし、100 MB 以上のメモリにアクセスできません。

以下は私のダミーマッピングです。

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(ほぼ1 GB)で終わります。しかし、私のメモリは512MBしかありませんが、どのようにこの仮想マップに入ることができますか?

  2. ユーザー空間から直接アドレスを使用して物理メモリにアクセスできますか?それでは、アクセスできる最大メモリサイズは何ですか?そしてそれを知る方法。

ベストアンサー1

mem=48Mカーネルが使用する物理RAMの量を制限するために、カーネルパラメータ(たとえば)を正常に使用しました。その後、メモリマッピングが必要なカーネルドライバの残りのRAMを使用できます。

カーネルのドキュメントをご覧くださいDocumentation/memory.txt

おすすめ記事