在系统DRAM上调用ioremap()
是不是很糟糕。我想在系统DRAM中预留一个不会被任何其他进程使用的空间。这会是这样做的吗?我知道DRAM实际上不是IO内存所以我不确定这是不是很糟糕的做法。
答案 0 :(得分:2)
在系统DRAM上调用ioremap()是不好的。
不应使用 ioremap()重新映射由内核管理的系统内存。这些多个映射可能会导致某些体系结构/处理器上的数据损坏。有关ARM的问题,请参阅此问题的this article。
您可以尝试通过从内核管理中在引导时排除相关内存区域来确保单个映射(使用 ioremap())。
在ARM上使用ATAG(ATAG_MEM
标签)或设备树(memory
属性)指定减少的物理内存。
否则,请在内核命令行中使用 memmap = 内核参数:
1835 memmap=nn[KMG]$ss[KMG]
1836 [KNL,ACPI] Mark specific memory as reserved.
1837 Region of memory to be reserved is from ss to ss+nn.
1838 Example: Exclude memory from 0x18690000-0x1869ffff
1839 memmap=64K$0x18690000
1840 or
1841 memmap=0x10000$0x18690000
还应通过 request_mem_region()声明内存区域,以防止多个请求以及 / proc / iomem 的完整性/准确性。
答案 1 :(得分:1)
使用" mem"可以在系统启动时保留内存。在内核命令行参数中。
LDD3 Ch-15 Pg 443
例如,如果你有256 MB,则参数mem = 255M保留内核 使用顶级兆字节。您的模块稍后可以使用以下代码来访问此类内存:
dmabuf = ioremap(0xFF00000 / * 255M /,0x100000 / 1M * /);
然而,这不是有效的方法,因为内核不能使用这个保留的内存。在我目前工作的SoC上,使用连续内存分配器(CMA)保留内存,当SoC驱动程序不使用此内存时,允许内存被其他进程重用。