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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值