2.Linux模塊編程

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");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章