我需要从内核中保留一个大的物理连续 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的物理内存的
我有一系列查询,
内核映射从 0xc0b43e10 开始,到 0xffff1000 结束(几乎 1GB)。但是我只有 512 MB 内存,以及它如何适合这个虚拟映射。
我是否能够使用用户空间的直接地址访问物理内存。如果是这样,我最多可以访问多少内存大小。以及如何知道它。
答案1
我已成功使用内核参数mem=48M
(作为示例)来限制内核使用的物理 RAM 量。然后,您可以在内核驱动程序中使用剩余的 RAM,您需要在其中进行内存映射。
请参阅内核文档Documentation/memory.txt