PL可以在运行时更改。
我的模块允许进程访问指定的硬件寄存器和页面。这些映射在我的模块的configfs绑定中配置(在运行时)。
每个映射都在configfs中有一个条目,通过它可以访问。
我想允许进程mmap整个页面,以便能够直接与PL通信。
但是configfs不支持mmap。
- 有没有什么原因呢?
- Sysfs支持mmap,所以我看不出configfs为什么不支持。
一种解决方案是将我的configfs树镜像到sysfs中,但这违背了使用configfs的初衷...有什么想法吗?
PL可以在运行时更改。
我的模块允许进程访问指定的硬件寄存器和页面。这些映射在我的模块的configfs绑定中配置(在运行时)。
每个映射都在configfs中有一个条目,通过它可以访问。
我想允许进程mmap整个页面,以便能够直接与PL通信。
但是configfs不支持mmap。
一种解决方案是将我的configfs树镜像到sysfs中,但这违背了使用configfs的初衷...有什么想法吗?
configfs
不是 sysfs
的替代品。实际上,它可以被看作是 sysfs
的相反面。
sysfs
通过文件系统接口提供内核对象的视图。它可以用于更改这些对象中的内容或执行某些操作,但它并不是为此而设计的。关键点在于,每个在 sysfs
中表示的对象都是在内核中创建和销毁的。内核控制着 sysfs 表示的生命周期,而 sysfs 只是这一切的一个窗口。
另一方面,configfs
提供了一种通过文件系统接口创建或更改内核对象的方式。这是一个根本性的区别。用户空间进程可以在 configfs
中创建目录。这个操作将导致内核中回调函数的执行以及相应内核对象的创建。目录中的文件将表示各种对象组件的状态。
我猜测,由于这两种情况下内核与用户空间进程之间数据交换的性质,认为在 configfs
中没有必要支持 mmap。
在没有看到您的系统设计/架构的情况下,很难说出确切的建议。从您的描述来看,sysfs
可能是满足您期望目标的所需工具。您需要访问的所有对象都是从内核中创建、修改和销毁的。在您的模块中,可以通过 sysfs
接口对现有内核结构/对象进行有限的设置/更改。然而,如果每个工具都有其特定的用途,那么您很可能希望在您的模块中同时拥有 sysfs
和 configfs
接口。如果这样做能使事情变得更加清晰明了,则没有什么不好的。