linux模块基础知识

一. 为什么要使用模块

linux属于微内核操作系统,整个内核都运行在内核空间,但是linux的功能是可以动态加载的,加载机制就是使用模块来实现的。

linux使用模块机制可以实现以下特点:

(1)模块可以动态加载和卸载。

(2)模块加载后,完全与内核融为一体。


二. 最简单的模块实例

/***********************************************************************
* File:   hello.c
* Author:  Ting
* Desc:   hello module code
* History: June 27th 2012
***********************************************************************/
#include <linux/init.h>
#include <linux/module.h>

static int __init hello_init(void)
{
     printk(KERN_ALERT "Hello world\n");
     return 0;
}

static void __exit hello_exit(void)
{
     printk(KERN_ALERT " Hello world exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("Ting");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("A hello world Module");
MODULE_ALIAS("Hello World Module"); 

 
 

三. 模块程序结构

(1) 模块加载和卸载函数。通过module_init 和module_exit 这两个函数来限定某个函数是加载或卸载函数,加载和卸载函数分别在模块加载和卸载时被内核自动调用执行

(2) 模块许可证声明。使用MODULE_LICENSE来声明,一般使用“Dual BSD/GPL”.

(3) 模块参数。模块加载时传给模块的全局变量。

(4) 模块导出符号。使用EXPORT_SYMBOL(符号名) 或 EXPORT_SYMBOL_GPL(符号名)来声明该符号名可以被别的模块使用。符号名可以是一个变量或函数,linux提供的驱动模型很多是采用模块导出符号来供别的驱动使用。在/proc/kallsyms文件中对应则会内核符号表。

(5) 模块描述。使用 MODULE_DESCRIPTION 声明。

(6) 模块作者。使用 MODULE_AUTHOR 声明。

(7) 模块别名。使用 MODULE_ALIAS 声明。

(8) 模块版本。使用 MODULE_VERSION 声明。

(9) 模块设备表。使用 MODULE_DEVICE_TABLE 声明。


四. 模块操作

insmod xx_oo.ko ------ 加载模块

insmod xx_oo.ko 参数名=参数值 ------ 加载模块并传递模参数

rmmod xx_oo -----卸载模块

lsmod -----显示加载的模块信息,该命令实际是读取/proc/modules文件,另外内核已加载的模块信息也位于/sys/module目录下。

modprobe -----加载该模块以及该模块依赖的其他模块

modprobe  -r  xx_oo  ------卸载该模块以及该模块依赖的其他模块

modinfo xx_oo.ko ------显示模块信息

request_module(module_name);  ------在内核中使用这个函数来动态加载一个模块

request_module( “char-major-%d-%d”,MAJOR(dev),MINOR(dev) );  -----在内核中使用这个函数来动态加载一个模块


五. 模块编译

若模块由一个源文件组成,makefile模板如下:

ifneq ($(KERNELRELEASE),)

obj-m := xx_oo.o

else
	
KDIR := /home/Ting/linux-2.6.32.2
all:
	make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*

endif

如果模块式由多个源文件组成,只有将上面的 obj-m := xx_oo.o  改成下面这样就可以了:

obj-m := xx_oo.o
xx_oo-objs := file1.o file2.o

 

注:本内容为本人原创,仅仅为了及时总结知识点以免忘记,所以内容不保证完全正确,如有不同意见,欢迎指正,以使我的及时纠正!

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值