内核模块的配置文件

时间:2018-12-18 07:29:05

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

我学习了如何编写Linux内核驱动程序,现在我想让用户空间的用户可以更改模块(或任何其他子系统/模块)的行为。

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

我想到了procfs,我可以制作一个模块来创建/proc/file并响应用户空间中的读/写操作。

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

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

1 个答案:

答案 0 :(得分:0)

1)通常,如果它是配置和一些参数列表,则ioctl更为流行,建议使用它。

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

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

最简单的方法是创建一些回调ptr并在内核源代码下对其进行定义。然后,在初始化模块A时,配置回调ptr,然后从模块B调用它。在这种情况下,您将摆脱模块依赖性。

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

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

希望对您有帮助。