在系统DRAM上调用ioremap()
不好吗。我想在系统DRAM中保留一个不会被任何其他进程使用的空间。这是做这件事的方法吗?我知道DRAM实际上并不是IO内存,所以我不确定这是否被认为是一种糟糕的做法。
在系统DRAM上调用ioremap()不好吗。
由内核管理的系统内存也不应该使用ioremap()重新映射。这些多个映射可能会导致某些体系结构/处理器上的数据损坏。请参阅这篇关于ARM的文章。
您可以尝试通过在启动时从内核的管理中排除有问题的内存区域来确保单个映射(使用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的完整性/准确性。
在系统启动时,可以通过在内核命令行参数中使用"mem"来保留内存。
LDD3 Ch-15第443页
例如,如果您有256MB,那么参数mem=255M会阻止内核使用最高的兆字节。您的模块稍后可以使用以下代码访问此类内存:
dmabuf=内部映射(0xFF00000/*255M/,0x100000/1M*/);
然而,这不是一种有效的方法,因为内核不能使用这个保留的内存。在我目前工作的SoC上,使用连续内存分配器(CMA)保留内存,当SoC驱动程序不使用该内存时,该分配器允许其他进程重用内存。