使用ioremap超过内核内存启动时间预留

时间:2015-07-27 11:10:03

标签: memory-management linux-kernel ioremap

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

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

3 个答案:

答案 0 :(得分:0)

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

(2)通过从内核内存映射中排除内存,然后使用ioremap,你实际上告诉内核它是某种特殊的“I / O”内存(想想PCI设备的I /例如,O存储区域,因此不会考虑进行寻呼。

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

答案 1 :(得分:0)

  1. ioremap对于任何物理地址,都会给出一个虚拟地址 你可以在那里放一些数据。
  2. 多个模块可以映射 这个区域并重写这个他们需要的只是起始地址(物理) 和大小
  3. Mem = / memmap =会将其隐藏在linux内核中,因此没有换出等
  4. 由于io区域在大多数架构中都是非可缓存和非相干的属性

答案 2 :(得分:0)

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

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

memblock_reserve(phys_addr_t base, phys_addr_t size)

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