gpt4 book ai didi

linux - 将设备驱动程序实现为一组内核模块

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:04 25 4
gpt4 key购买 nike

我有一个用户空间库,用于通过串行端口与设备进行通信。该库相当复杂,执行许多任务,包括将 header 放入有效负载、消息分段、发送消息、处理响应、初始化设备等...

我想将该库移至内核空间,并正在考虑将该库分解为几个定义良好的内核模块,以便

  • 我可以在将来更换层(例如用 SPI 层更换 USART 层)。
  • 开发会更容易。如果将其分割,我可以将库逐个迁移到内核空间。

以前有人做过类似的事情吗?内核模块之间通信的最佳方法(就效率而言)是什么?有什么我应该避免的陷阱吗?

最后,是否有任何作为一组内核模块实现的驱动程序的好示例?

最佳答案

所有内核模块都在同一地址空间中运行。要从一个模块调用另一个模块,您需要导出一些符号:函数或全局变量。尽管在这种情况下使用全局变量可能是一种不好的风格。请注意,导出的符号将与所有其他内核符号位于同一 namespace 中。为了避免名称冲突,您应该为它们使用一些定义明确的前缀,通常是模块的名称和下划线。因此,如果您的模块之一名为 foo 并且您想要导出函数 bar(),您可以在 foo 模块中使用如下代码:

void foo_bar(const char *prm) {
printk (KERN_INFO "foo_bar(%s) was called\n", prm);
}
EXPORT_SYMBOL(foo_bar);

在另一个模块中,比如 buz,只需调用此函数:

foo_bar("qux");

请注意,在内核模块中,您不能使用 libc(或其他库)功能,并且许多常见的功能(例如内存管理、文件 I/O、网络等)可能非常复杂。另请注意,内核模块调试不是一项简单的任务,许多错误会导致内核 panic ,而不是无害的段错误。

因此,在将某些工作库移至内核空间之前请三思。也许最好将您的库分解为相同的“模块”,但将其(或其中的大部分)保留在用户空间中。

关于linux - 将设备驱动程序实现为一组内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com