0

调用ioremap()系统 DRAM 是不是很糟糕。我想在系统 DRAM 中保留一个不会被任何其他进程使用的空间。这会是这样做的方法吗?我知道 DRAM 实际上不是 IO 内存,所以我不确定这是否被认为是不好的做法。

4

2 回答 2

2

在系统 DRAM 上调用 ioremap() 是不是很糟糕。

由内核管理的系统内存也不应该使用ioremap()重新映射。这些多重映射可能会导致某些架构/处理器上的数据损坏。有关 ARM 的此问题,请参阅本文

您可以尝试通过从内核管理中排除引导时有问题的内存区域来确保单个映射(使用ioremap() )。在 ARM 上,使用 ATAG(标签)或设备树(属性)
指定减少的物理内存。 否则在内核命令行中使用memmap=内核参数:ATAG_MEMmemory

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的完整性/准确性。

于 2014-11-12T23:59:33.883 回答
1

通过在内核命令行参数中使用“mem”,可以在系统引导期间保留内存。

LDD3 Ch-15 第 443 页

例如,如果您有 256 MB,则参数 mem=255M 会阻止内核使用最高兆字节。您的模块稍后可以使用以下代码来访问此类内存:

dmabuf = ioremap (0xFF00000 /* 255M /, 0x100000 / 1M */);

然而,这不是有效的方法,因为内核不能使用这个保留的内存。在我当前工作的 SoC 上,内存是使用连续内存分配器(CMA)保留的,当 SoC 驱动程序不使用此内存时,它允许其他进程重用内存。

于 2014-12-25T15:12:44.040 回答