gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:05:00 27 4
gpt4 key购买 nike

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

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

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

理想情况下,我更愿意保留模拟器模块中的内存,并在卸载模拟器模块后释放它。另一种不错但不太受欢迎的方法是在第一次加载模拟器时保留内存并将其保存在内存中。

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

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

最佳答案

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

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

更激进的方法是取消设置 RAM 资源上的 IORESOUCE_BUSY。这将容纳在 iomem_resource 下保留资源的驱动程序,但对我来说这似乎很不安全。

重新映射问题通过将每个“资源”内存页标记为保留来解决。它有一个宏,可以操纵页面标志。只需确保分配页面对齐的内存即可。

该站点的工作代码太长;它可以在 http://marc.info/?l=linux-mm&m=149280134601521 找到

关于memory-management - 在 Linux 中模拟设备 - 需要一种在 RAM 中分配资源的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43461463/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com