内核模块的配置文件

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

我学习了如何编写 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/

相关文章:

c - GTK 和 C 中的 Win32 Native API 有什么区别?

c - 反转 void 数组和要转换成的数据类型

linux - 内核空间有libc吗?

linux - 为什么大部分内核镜像在加载后在 RAM 中只有 ~1.5MB?

使用 makefile 创建单元测试

c - 信号量值的输出

c - 如何以编程方式更改 dmesg 的日志级别?

linux - 在什么情况下 phys_base 不为 0?

linux - 更新内核版本 - Centos 7

linux-kernel - 如何删除/禁用 8250.o 模块并实现我自己的 8250 驱动程序