【问题标题】:configuration file for kernel module内核模块的配置文件
【发布时间】:2019-05-18 14:05:20
【问题描述】:

我学习如何编写 linux 内核驱动程序,现在我想给用户空间的用户改变我的模块(或任何其他子系统/模块)的行为的可能性。

我想将任何值(字符串列表)存储在任何类型的配置文件/系统中,并以文件/系统内的值的形式 - 更改模块的行为。

我想到了procfs,我可以制作创建/proc/file 的模块并对来自用户空间的读/写操作做出反应。

问题是:如何从另一个读取该配置,将其命名为 B,内核空间中的模块?

也许另一种类型的配置是可能的(我考虑过 sysctl,但我发现没有存储任何字符串,我必须存储某种简单的“列表”)。

【问题讨论】:

    标签: c linux-kernel kernel linux-device-driver kernel-module


    【解决方案1】:

    1) 通常,如果是配置和一些参数列表,ioctl 比较流行,推荐使用。

    2) 你在问,有 2 个内核模块 - A 和 B,你想在 B 上读取 A 的配置。对吗?在这种情况下,无论您拥有 proc 或 ioctl(请记住,proc 不是真正的文件系统。您正在打印或读取并从某些内核变量返回一些值......您可以使用 VFS 从“fs”读取内容在内核中并返回字符串,但这是非常愚蠢的,因为您有用户空间控制。),最终,您需要将内核模块配置存储到一些变量中。如果你想从另一个模块中读取它们,你的变量应该使用 EXPORT_SYMBOL() 关键字公开,但通常我们不这样做。

    在您的符号上创建一些返回配置值的 API,并公开这些 API 并从另一个模块调用它。由于模块依赖,你可能需要小心。

    最简单的方法是创建一些回调 ptr 并在内核源代码下定义它。然后,在模块A初始化的时候,配置回调ptr,从模块B调用,这样就可以摆脱模块依赖了。

    或者,在模块B上创建回调指针并将模块B作为内置模块并暴露回调指针。

    然后,您可以从模块 A 初始化它们,并且无论何时从 B 调用它,您都可以在该回调 ptr 上检查“null ptr”。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 2021-07-16
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多