2.1模塊編程結構
1.模塊加載函數
int test_init ( void)
{
.....
return 0;
}
module_init(test_init);
2.模塊卸載函數
voidtest_exit(void)
{
.....
module_exit(test_exit);
}
3.一個標準的Linux的內核模塊程序
<span style="font-size:14px;">#include <linux/init.h>
2 #include <linux/module.h>
3
4 static int test_init(void)
5 {
6 printk("hello kernel\n");
7 return 0;
8 }
9
10 void test_exit(void)
11 {
12 printk("Bye Bye!!!\n");
13 }
14
15 module_init(test_init);
16 module_exit(test_exit);
17
18 MODULE_LICENSE("GPL");
19 MODULE_AUTHOR("ALONSO");
20 MODULE_VERSION("V0.2");
</span>
2.2模塊編譯
1.編譯模塊
make -C /home/android-kernel-samsung-dev/ M=`pwd` modules
2.安裝模塊並指定位置
make -C /home/android-kernel-samsung-dev/ M=`pwd` modules_install INSTALL_MOD_PATH=/nfs/mini_rootfs/
2.4模塊命令
1. 模塊的插入
查看本機內核版本
`uname -r` (本機內核版本)
2. 插入模塊
insmod test.ko
3. 查看本機模塊
lsmod
4. 模塊的卸載
1)查看模塊名字
lsmod
2)卸載模塊
rmmod test
注意: rmmod 後面要加用lsmod 查看到的模塊名字'test'而不是test.ko'
2.5 模塊宏信息
1. 所有模塊代碼都應該指定所使用的許可證:
MODULE_LICENSE("Dual BSD/GPL");
2. 此外還有可選的其他描述性定義:
MODULE_AUTHOR("");
MODULE_DESCRIPTION("");
MODULE_VERSION("");
MODULE_ALIAS("");
MODULE_DEVICE_TABLE("");
上述MODULE_聲明習慣上放在文件最後。可以用modinfo 查看信息
2.6 內核printk
1. printk 是內核中非常好用的一種信息輸出方法
printk 和printf 很象,不同的是printk 可以附加不同的日誌級別,從而可以根據消息的嚴重程度分類。
2.打印級別
KERN_EMERG "<0>": 緊急情況
KERN_ALERT "<1>": 需要立即被注意到的錯誤
KERN_CRIT "<2>": 臨界情況
KERN_ERR "<3>": 錯誤
KERN_WARNING"<4>": 警告
KERN_NOTICE "<5>": 注意
KERN_INFO "<6>": 非正式的消息
KERN_DEBUG "<7>": 調試信息(冗餘信息)
未指定優先級的默認級別定義在/kernel/printk.c 中:#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
3. 當優先級的值小於console_loglevel 這個整數變量的值,信息才能顯示出來。而console_loglevel 的初始值DEFAULT_CONSOLE_LOGLEVEL 也定在kernel/printk.c 中。
#define DEFAULT_CONSOLE_LOGLEVEL 7
2.7 模塊參數
static int howmany = 1;
static char *whom = "hello args";
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);
----------------------------------------------------------
#insmod test.ko howmany=99
2.8 多文件編譯
obj-m += app.o
app-objs += add.o test.o
2.9 導出符號
#include <linux/init.h>
#include <linux/module.h>
#include “add.h”
int add(int x, int y)
{
return (x + y);
}
EXPORT_SYMBOL(add);
MODULE_LICENSE("GPL");