0

首先我必须承认我是一个新手。所以请不要对我太苛刻。我想在启动时保留内存,然后在内核模块中使用这个内存,以确保这个模块是唯一使用这个空间的模块。我会这样:将 mem= 和 memmap= 添加到 kerenl 参数以在启动时保留内存。我的问题从这里开始:

  1. 如果我在我的模块代码中的这个空间上使用ioremap,它可以在其他模块中访问吗?还是其他内核子系统仍然看不到它?
  2. 第二个问题:我怎么能确定这个保留的内存永远不会移动到交换空间?
  3. 第三个:我怎样才能像块设备一样访问这个内存?我的意思是像 /dev/sda 或......
4

3 回答 3

0

(1) 通过使用ioremap,您正在为内存建立一个内核虚拟地址。内核空间中的任何其他代码都可以通过将正确的值粘贴到指针变量中来访问它。AFAIK,没有办法将任何内存区域“锁定”到单个内核模块。内核的所有部分都是全能的,因此可以访问他们喜欢的任何内存——或者至少,他们可以执行允许他们访问他们喜欢的任何内存所需的所有操作。出于同样的原因,没有理由让另一段内核代码访问内存,除非您以某种方式导致了这种情况。毕竟,您已经告诉内核的其余部分它不是普通内存。

(2) 通过从内核内存映射中排除内存,然后使用ioremap您实际上是在告诉内核它是某种特殊的“I/O”内存(例如,考虑 PCI 设备的 I/O 内存区域),因此不会因为这个原因考虑分页。

我不知道有什么方法可以在不为内存实现自己的设备接口的情况下实现 (3) 中的目标。但是,如果这就是您想要使用它的目的,为什么不简单地创建一个 ramdisk 文件系统呢?不需要(额外的)内核编程。(参见Documentation/blockdev/ramdisk.txt内核源代码树。)

于 2015-07-27T21:33:07.063 回答
0
  1. 任何物理地址的 ioremap 都会给出一个虚拟地址,您可以使用该地址将一些数据放在那里。
  2. 多个模块可以映射这个区域并重写它,它们所需要的只是起始地址(物理)和大小
  3. Mem=/memmap= 将从 linux 内核中隐藏它,所以没有交换等
  4. 由于 io 区域如此不可缓存且不连贯,因此在大多数架构中都是属性
于 2015-09-01T10:00:58.280 回答
0

我认为 ioremap() 不必要地拖入讨论以在启动时保留内存。

最好使用(实际上主要在内核中使用)遵循 API

memblock_reserve(phys_addr_t base, phys_addr_t size)

检查文件 memblock.c 以获得更多理解。

于 2015-09-01T12:24:43.040 回答