物理内存如何映射到内核空间?

物理内存如何映射到内核空间?

我需要从内核中保留一个大的物理连续 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)。但是我只有 512 MB 内存,以及它如何适合这个虚拟映射。

  2. 我是否能够使用用户空间的直接地址访问物理内存。如果是这样,我最多可以访问多少内存大小。以及如何知道它。

答案1

我已成功使用内核参数mem=48M(作为示例)来限制内核使用的物理 RAM 量。然后,您可以在内核驱动程序中使用剩余的 RAM,您需要在其中进行内存映射。

请参阅内核文档Documentation/memory.txt

相关内容