Memory management 在Linux中模拟设备-需要一种在RAM中分配资源的方法

Memory management 在Linux中模拟设备-需要一种在RAM中分配资源的方法,memory-management,linux-kernel,resources,linux-device-driver,emulation,Memory Management,Linux Kernel,Resources,Linux Device Driver,Emulation,我正在为该设备编写一个Linux设备驱动程序和一个模拟器。为了让设备驱动程序工作,我需要给它内存资源。如果使用模拟器,我需要在模拟器中分配这些资源 问题是,我无法在系统RAM中分配资源,因为在系统RAM地址上不允许ioremap() 我现在使用的方法是使用内核命令行中的mem选项限制系统可见的内存量。我更愿意使用其他方法,因为我不想告诉所有用户编辑他们的GRUB设置并限制他们的RAM使用 理想情况下,我希望在emulator模块中保留内存,并在emulator模块卸载后释放内存。另一个好的方法是

我正在为该设备编写一个Linux设备驱动程序和一个模拟器。为了让设备驱动程序工作,我需要给它内存资源。如果使用模拟器,我需要在模拟器中分配这些资源

问题是,我无法在系统RAM中分配资源,因为在系统RAM地址上不允许ioremap()

我现在使用的方法是使用内核命令行中的
mem
选项限制系统可见的内存量。我更愿意使用其他方法,因为我不想告诉所有用户编辑他们的GRUB设置并限制他们的RAM使用

理想情况下,我希望在emulator模块中保留内存,并在emulator模块卸载后释放内存。另一个好的方法是在模拟器第一次加载时保留内存,并将其保留在内存中,尽管不是首选方法

据我所知,模拟器应该将内存标记为保留或断开连接。但我没有看到任何导出的函数可以做到这一点。我需要从一个内核模块开始。要求用户重新编译内核是不现实的


我可以使用可选的内核接口,比如内存热插拔。它们是在流行的发行版内核上启用的,所以大多数用户应该可以接受。但是我找不到任何可供模块使用的API来保留或“断开”内存块。

我找到了一个好的解决方案。这个问题有两个方面,资源保留和资源重新映射到内核地址空间

通过查找包含的RAM资源并使用request_resource()分配其下的仿真器资源,可以修复保留问题。被测试的驱动程序可以调用request_region(),但它应该使用设备资源的父资源,而不是
iomem_资源
。我认为从父级获取资源是一种合理的方法,而不是遍历整个资源树,尽管后者在内核中是一种常见的做法

更激进的方法是在RAM资源上取消设置
ioresource\u BUSY
。这将适应在
iomem\u resource
下保留资源的驱动程序,但对我来说这似乎相当不安全

通过将每个“资源”内存页标记为保留,修复了重新映射问题。它有一个宏,用于处理页面标志。只需确保分配页对齐内存即可


此站点的工作代码太长;可以在

中找到它,我不确定您是否能够从模块中执行此操作。当然可以使用您提到的mem参数,或者设备树绑定,甚至破解内核的引导代码。难道你不能只
kmalloc
仿真程序的内存,然后让你的驱动程序更智能,从而区分物理层和虚拟地址吗?“系统RAM地址上不允许使用ioremap()”--这可能取决于体系结构,甚至是arch的版本,例如ARM请参阅。您希望内存位于特定的物理地址吗?否则,请查看用于DMA可访问内存的各种内存分配器。我可以使用mark_page_reserved()处理ioremap(),但我仍在为资源分配而挣扎,这是一个单独的问题。