















本文档简单说明内核模块堆叠的基本信息。
在Linux中内核模块的堆叠(module stacking)是指一个模块对另一个模块的依赖情况。
模块堆叠有利于模块间的代码复用和功能扩展:一个设备驱动可能依赖于一个提供通用功能的模块。
内核模块堆叠的关键点:
示例:
假设我们有两个模块:module_a和module_b,其中module_a依赖于module_b导出的一个函数
module_b.c通过EXPORT_SYMBOL(module_b_exported_function);导出module_b_exported_function
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int __init module_b_init(void)
{
printk(KERN_INFO "Module B initialized\n");
return 0;
}
static void __init module_b_exit(void)
{
printk(KERN_INFO "Module B exiting\n");
}
// 导出一个函数
void module_b_exported_function(void)
{
printk(KERN_INFO "Module B exported function called\n");
}
EXPORT_SYMBOL(module_b_exported_function);
module_init(module_b_init);
module_exit(module_b_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Module B providing a function for other modules");
module_a.c使用module_b的功能 extern void module_b_exported_function(void);
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
// 声明来自module_b的函数
extern void module_b_exported_function(void);
static int __init module_a_init(void)
{
printk(KERN_INFO "Module A initialized\n");
// 调用module_b导出的函数
module_b_exported_function();
return 0;
}
static void __init module_a_exit(void)
{
printk(KERN_INFO "Module A exiting\n");
}
module_init(module_a_init);
module_exit(module_a_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Module A using Module B's function");
使用时,可使用insmod/modprobe加载module_a;使用modprobe时会自动处理依赖关系
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。