【问题标题】:using ioremap over kernel memory boot time reservation在内核内存启动时间保留上使用 ioremap
【发布时间】:2015-07-27 11:10:02
【问题描述】:
首先我必须承认我是一个新手。所以请不要对我太苛刻。
我想在启动时保留内存,然后在内核模块中使用这个内存,以确保这个模块是唯一使用这个空间的模块。
我会这样:
将 mem= 和 memmap= 添加到 kerenl 参数以在引导时间保留内存。
我的问题从这里开始:
- 如果我在模块代码中的这个空间上使用 ioremap 是否可以在其他模块中访问它?还是其他内核子系统仍然看不到?
- 第二个问题:我如何确定这个保留的内存永远不会移动到交换空间?
- 第三个:我怎样才能像块设备一样访问这个内存?我的意思是像 /dev/sda 或.....。
【问题讨论】:
标签:
memory-management
linux-kernel
ioremap
【解决方案1】:
(1) 通过使用ioremap,您正在为内存建立一个内核虚拟地址。内核空间中的任何其他代码都可以通过将正确的值粘贴到指针变量中来访问它。 AFAIK,没有办法将任何内存区域“锁定”到单个内核模块。内核的所有部分都是全能的,因此可以访问他们喜欢的任何内存——或者至少,他们可以执行允许他们访问他们喜欢的任何内存所需的所有操作。出于同样的原因,没有理由让另一段内核代码访问内存,除非您以某种方式导致了这种情况。毕竟,您已经告诉内核的其余部分它不是普通内存。
(2) 通过从内核内存映射中排除内存,然后使用ioremap,您实际上是在告诉内核它是某种特殊的“I/O”内存(想想 PCI 设备的 I/O 内存例如,区域),因此不会考虑分页。
如果不为内存实现自己的设备接口,我不知道有什么方法可以实现 (3) 中的目标。但是,如果这就是您想要使用它的目的,为什么不简单地创建一个 ramdisk 文件系统呢?不需要(额外的)内核编程。 (参见内核源代码树中的Documentation/blockdev/ramdisk.txt。)
【解决方案2】:
- 对于任何物理地址的ioremap,都会给出一个虚拟地址,它
你可以用来放一些数据。
- 多个模块可以映射
这个区域并重写所有他们需要的是起始地址(物理)
和大小
- Mem=/memmap= 将从 linux 内核中隐藏它,所以没有交换等
- 由于 io 区域不可缓存且不连贯,因此在大多数架构中都将成为属性
【解决方案3】:
我认为 ioremap() 被不必要地拖入讨论以在启动时保留内存。
最好使用(实际上主要在内核中使用)遵循API
memblock_reserve(phys_addr_t base, phys_addr_t size)
检查文件 memblock.c 以获得更多理解。