如何编写Linux驱动模块调用/使用另一个驱动模块?

发布于 2024-07-11 10:15:52 字数 139 浏览 11 评论 0原文

我正在开发一个 Linux 驱动程序可加载模块,我必须在我的驱动程序中使用另一个设备。(某种驱动程序堆叠在另一个驱动程序上)

我如何在我的驱动程序中调用/使用另一个驱动程序? 我认为它们都在内核中,所以可能有一种方法可以直接使用另一个驱动程序。

I'm developing a Linux driver loadable module and I have to use another device in my driver.(kind of driver stacked on another driver)

How do I call/use another driver in my driver? I think they are both in the kernel so there might be a way that can use another driver directly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妳是的陽光 2024-07-18 10:15:52

您将需要 EXPORT_SYMBOL(或 EXPORT_SYMBOL_GPL)宏。 例如:

/* mod1.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
....
void mod1_foo(void)
{
    printk(KERN_ALERT "mod1_foo\n");
}
EXPORT_SYMBOL(mod1_foo);

/* mod2.h */
....
extern void mod1_foo(void);
....

/* mod2.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
#include "mod2.h"
int init_module(void)
{
    mod1_foo();
    ...

这应该是一帆风顺的,但是您当然必须小心命名空间 - 踩踏别人的内核模块符号将是不幸的。

You will need the EXPORT_SYMBOL (or EXPORT_SYMBOL_GPL) macro. For example:

/* mod1.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
....
void mod1_foo(void)
{
    printk(KERN_ALERT "mod1_foo\n");
}
EXPORT_SYMBOL(mod1_foo);

/* mod2.h */
....
extern void mod1_foo(void);
....

/* mod2.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
#include "mod2.h"
int init_module(void)
{
    mod1_foo();
    ...

This should be plain sailing, but you must of course be careful with the namespace - stomping on somebody else's kernel module symbols would be unfortunate.

久随 2024-07-18 10:15:52

您忘记提到,您还应该研究 try_module_get/module_put/symbol_get/symbol_put/symbol_request,以确保加载其他模块,并且在使用过程中不会卸载它。 但我不记得具体细节了; 我认为 modprobe 将确保加载其他模块,但我不确定是否会添加卸载的运行时依赖项。 我猜想其他一些情况可能需要这些 API,但需要了解它们才能检查这一点。

顺便说一句,免费的《Linux 设备驱动程序》一书可以在这里找到,它将回答这个问题以及更多其他问题:
http://lwn.net/Kernel/LDD3/

You forgot to mention that you should also study try_module_get/module_put/symbol_get/symbol_put/symbol_request, for ensuring loading of the other module, and the fact that it is not unloaded during usage. I don't recall the exact details though; I think that modprobe will ensure the other module is loaded, but I'm not sure if the runtime dependency for unloading will be added. I guess that those APIs might be needed for some other cases, but needs to know about them to check this.

Btw, the free book Linux Device Drivers is available here, and it will answer this question and much more:
http://lwn.net/Kernel/LDD3/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文