我学习了如何编写 Linux 内核驱动程序,现在我想为用户提供从用户空间更改我的模块(或任何其他子系统/模块)行为的可能性。
我想将任何值(字符串列表)存储在任何类型的配置文件/系统中,并以文件/系统内的值的形式存储 - 更改模块的行为。
我想到了 procfs
,我可以制作创建 /proc/file
并对用户空间的读/写操作使用react的模块。
问题是:如何从内核空间中的另一个模块(将其命名为 B)读取该配置?
也许另一种类型的配置是可能的(我考虑过 sysctl,但我发现没有存储字符串,我必须存储某种简单的“列表”)。
最佳答案
1) 通常,如果是配置和一些参数列表,ioctl 更流行,推荐使用它。
2) 你问,有 2 个内核模块 - A 和 B,你想读取 A 在 B 上的配置。对吧?在这种情况下,无论您有 proc 或 ioctl (请记住,proc 不是真正的文件系统。您正在打印或读取并从某些内核变量返回一些值......您可以使用 VFS 从“fs”读取内容在内核中并返回字符串,但这非常非常愚蠢,因为您拥有用户空间控制权。),最终,您需要将内核模块配置存储到一些变量中。如果您想从另一个模块读取它们,您的变量应该使用 EXPORT_SYMBOL() 关键字公开,但通常我们不这样做。
在您的符号上创建一些 API,该 API 返回配置值并公开这些 API 并从另一个模块调用它。由于模块依赖性,您可能需要小心。
最简单的方法是创建一些回调指针并在内核源代码下定义它。然后,当模块 A 初始化时,配置回调 ptr,并从模块 B 调用它。这样,您将摆脱模块依赖。
或者,在模块 B 上创建回调指针,并将模块 B 作为内置模块并公开回调指针。
然后,从模块 A 中,您可以初始化它们,并且每当您从 B 中调用它时,您可以检查该回调 ptr 上的“null ptr”。
希望对您有帮助。
关于内核模块的配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53828218/