Linux 驅動模組及模組之前的通訊(模組函式的相互呼叫)
阿新 • • 發佈:2019-01-07
1.3.2 模組機制
insmod :安裝module
rmmod :解除安裝module
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int __init xxx_init(void)
{
/* */
return 0;
}
void __exit xxx_exit(void)
{
}
module_init(xxx_init);
module_exit(xxx_exit);
MODULE_LICENSE();
MODULE_DESCRIPTION();
MODULE_ALIAS();
MODULE_VERSION();
MODULE_AUTHOR();
5.2.1 驅動模組的組成
1.標頭檔案(必選)
#include <linux/module.h>
#include <linux/init.h>
2.模組引數(可選)
static long a = 1;
static int b = 1;
module_param(a, long, S_IRUGO);
module_param(b, int, S_IRUGO);
引數資料型別可以是:byte short ushort int uint long ulong bool charp(字元指標型別);
模組載入時傳給驅動模組的引數 insmod test.ko name="kernel"
insmod 模組.ko 引數1=值1 引數2=值2 引數3=值3 //引數之間沒有逗號
3.模組載入函式(必須)
4.模組解除安裝函式(必須)
5.模組許可宣告(必須)
MODULE_LICENSE("GPL"); //任一版本的GNU公共許可權
MODULE_LICENSE("GPL v2"); //GPL 版本2許可權
MODULE_LICENSE("GPL and additional rights"); //GPL及其附加許可權
MODULE_LICENSE("Dual BSD/GPL"); //BSD/GPL雙重許可權
MODULE_LICENSE("Dual MPL/GPL"); //MPL/GPL 雙重許可權
MODULE_LICENSE("Proprietary"); //專有許可權
5.3.4 模組之間的通訊例項
add_sub.c
#include <linux/init.h>
#include <linux/module.h>
#include "add_sub.h"
long add_integer(int a,int b)
{
return a+b;
}
long sub_integer(int a, int b)
{
return a-b;
}
EXPORT_SYSMBOL(add_integer);
EXPORT_SYSMBOL(sub_integer);
MODULE_LICENSE("Dual BSD/GPL");
add_sub.h
#ifndef __ADD_SUB_H__
#define __ADD_SUB_H__
long add_integer(long a, long b);
long sub_integer(long a, long b);
#endif
Kconfig 主要語法
config
menuconfig
choice/endchoice
comment //註釋
menu/endmenu
if/endif
isocurce "../linx/abc"
insmod :安裝module
rmmod :解除安裝module
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int __init xxx_init(void)
{
/* */
return 0;
}
void __exit xxx_exit(void)
{
}
module_init(xxx_init);
module_exit(xxx_exit);
MODULE_LICENSE();
MODULE_DESCRIPTION();
MODULE_ALIAS();
MODULE_VERSION();
MODULE_AUTHOR();
5.2.1 驅動模組的組成
1.標頭檔案(必選)
#include <linux/module.h>
#include <linux/init.h>
2.模組引數(可選)
static long a = 1;
static int b = 1;
module_param(a, long, S_IRUGO);
module_param(b, int, S_IRUGO);
引數資料型別可以是:byte short ushort int uint long ulong bool charp(字元指標型別);
模組載入時傳給驅動模組的引數 insmod test.ko name="kernel"
insmod 模組.ko 引數1=值1 引數2=值2 引數3=值3 //引數之間沒有逗號
3.模組載入函式(必須)
4.模組解除安裝函式(必須)
5.模組許可宣告(必須)
MODULE_LICENSE("GPL"); //任一版本的GNU公共許可權
MODULE_LICENSE("GPL v2"); //GPL 版本2許可權
MODULE_LICENSE("GPL and additional rights"); //GPL及其附加許可權
MODULE_LICENSE("Dual BSD/GPL"); //BSD/GPL雙重許可權
MODULE_LICENSE("Dual MPL/GPL"); //MPL/GPL 雙重許可權
MODULE_LICENSE("Proprietary"); //專有許可權
5.3.4 模組之間的通訊例項
add_sub.c
#include <linux/init.h>
#include <linux/module.h>
#include "add_sub.h"
long add_integer(int a,int b)
{
return a+b;
}
long sub_integer(int a, int b)
{
return a-b;
}
EXPORT_SYSMBOL(add_integer);
EXPORT_SYSMBOL(sub_integer);
MODULE_LICENSE("Dual BSD/GPL");
add_sub.h
#ifndef __ADD_SUB_H__
#define __ADD_SUB_H__
long add_integer(long a, long b);
long sub_integer(long a, long b);
#endif
Kconfig 主要語法
config
menuconfig
choice/endchoice
comment //註釋
menu/endmenu
if/endif
isocurce "../linx/abc"
source "/drivers/add_sub_Kconfig/Kconfig"