首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在内核内存引导时间预留上使用ioremap

在内核内存引导时间预留上使用ioremap
EN

Stack Overflow用户
提问于 2015-07-27 11:10:02
回答 3查看 581关注 0票数 0

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

  1. 如果我在我的模块代码中在这个空间上使用ioremap,它在其他模块中可以访问吗?还是其他内核子系统还看不见呢?
  2. 第二个问题:如何确保这个预留内存永远不会移动到交换空间?
  3. 第三:如何像块设备一样访问这个内存?我是说/dev/sda或者..。。
EN

回答 3

Stack Overflow用户

发布于 2015-07-27 21:33:07

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-09-01 10:00:58

  1. 对于任何物理地址,ioremap都会给出一个虚拟地址,您可以使用这个地址将一些数据放在那里。
  2. 多个模块可以映射这个区域并重写它,它们所需要的只是开始地址(物理)和大小。
  3. Mem=/memmap=将其隐藏在linux内核中,因此不需要交换等等。
  4. 由于io区域在大多数体系结构中都是不可缓存和非缓存的属性。
票数 0
EN

Stack Overflow用户

发布于 2015-09-01 12:24:43

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

更好的使用(实际上主要是在内核中使用)是以下API

代码语言:javascript
复制
memblock_reserve(phys_addr_t base, phys_addr_t size)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31651543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档