![保留固定 RAM 内存区域作为块设备(具有给定的起始物理地址)](https://linux22.com/image/54585/%E4%BF%9D%E7%95%99%E5%9B%BA%E5%AE%9A%20RAM%20%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F%E4%BD%9C%E4%B8%BA%E5%9D%97%E8%AE%BE%E5%A4%87%EF%BC%88%E5%85%B7%E6%9C%89%E7%BB%99%E5%AE%9A%E7%9A%84%E8%B5%B7%E5%A7%8B%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80%EF%BC%89.png)
关于 RAM 磁盘有很多问题,我知道 ramfs 和 tmpfs 允许将 ram 用作块设备。然而我的兴趣是使用固定的内存地址范围作为块设备。
这是因为需要使用系统中可用的非易失性 RAM。我有 6GB 可用 RAM,还有 8GB 非易失性 RAM。 /proc/iomem 的输出给出了以下内容
100000000-17fffffff : 系统内存
180000000-37fffffff : 保留
这里从 6GB 到 14GB 的区域对应于非易失性 RAM 区域,该区域被 E820 BIOS 内存映射标记为保留。我的主要目的是在linux中使用这个NVRAM作为块设备。这对于测试 NVRAM 系统很有用。是否已经存在任何 linux 命令可以允许我使用该区域作为块设备,或者我是否必须编写自己的内核设备驱动程序来实现相同的功能?
答案1
我不是设备驱动程序方面的专家,但这里有一些可供您研发的建议:
- 如果内存被标记为“保留”,则操作系统无法触及它;您必须找到一种方法,让 BIOS 将其标记为可供操作系统使用,或者直接使用低级读写控制到控制它
- 如果 Linux 可以的话看内存,你仍然没有一个简单的方法来阻止 Linux 将它用作任何其他 RAM 块;可以尝试将此类 RAM 标记为“坏”,然后修改内核以仍然对其进行特殊使用(请检查有关此的内核文档,它已更改很多自从我上次侵入它以来,它正在以极快的速度发展)
- 考虑到上述内容是初步的(非决定性的或详尽的)可行性研究,我想说编写你的 ramdisk 块设备驱动程序是你的情况下最明智的选择,也许你应该将其贡献给 Linux 内核和/或与人们已经尝试过这个(也许这个问题的更好地方是Linux 内核邮件列表,如果您还没有在那里发布)
其他一些相关来源:
答案2
在引入tmpfs
/之前initramfs
,有一个ramdisk
用于加载initrd
图像的预定义固定大小的块设备,我认为是连续的,至少在早期的实现中是这样。
块驱动程序本身没有内存地址参数,只有大小,但内核用于在预定义地址(通过配置)加载 initrd 映像,因此可以查看一下主要的/在里面内核代码可以提供帮助(如果内存盘initrd 不再支持,但自从初始化文件系统已经存在了,很多年了,从未使用过内存盘不再)。
驱动程序来源是驱动程序/块/rd.c,如果我现在没看错的话是驱动程序/块/brd.c。
否则,寻找内存盘我发现一个看起来很有趣的实现: