首页 > 解决方案 > 内核模块的配置文件

问题描述

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

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

我想procfs,我可以制作模块来创建/proc/file和响应来自用户空间的读/写操作。

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

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

标签: clinux-kernelkernellinux-device-driverkernel-module

解决方案


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

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

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

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

或者,在模块 B 上创建回调指针并将模块 B 设为内置模块并公开回调 ptr。

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

希望对您有所帮助。


推荐阅读