linux内核模块实现教程,Linux内核分析(二)----内核模块简介|简单内核模块实现...

Linux内核分析(二)

昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某种意义上来说linux系统本身就是由一个个模块构成的,所以我会结合内核模块的设计,去分析内核,从而达到对linux内核的理解。

今天我们会分析到以下内容:

1.Linux内核模块简介

2.简单内核模块实现

lLinux内核模块简介

1.何为内核模块

在上一篇博文中我们先通过内核配置,在配置的过程中我们对内核的组件进行了选择(当然这个选择决定了我们内核的大小),然后才生成了我们最终的内核,那么我们如果想添加组件,怎么办?

最笨的方法是对内核进行重新配置,然后在重新编译。这样的话岂不是说我加一个组件就得重新编译内核,这显然不是很科学的方法,其实我们的linux内核提供在运行时可进行扩展的特性,这意味着当系统启动并运行时,我们可以向内核添加或移除部分功能。

我们在运行时添加到内核中的代码就被成为动态可加载内核模块,我们简称为内核模块。

2.内核模块的相关操作

a)加载内核模块:insmod

b)卸载内核模块:rmmod

c)查看内核模块:lsmod

3.模块声明

a)MODULE_LICENSE(“GPL”):内核可以识别的许可证有GPL(任意版本GNU通用公共许可证)、GPL v2等

b)MODULE_AUTHOR(“作者”):声明作者信息可以不用

c)MODULE_VERSION(“版本”):声明版本信息也可以不用

d)MODULE_DESCRIPTION(“功能描述”):声明模块功能,可不用

4.模块参数

我们可以在加载内核模块的时候向其传递参数,以让同一代码达到不同的效果。当然我们的参数必须用module_param宏来声明具体如下:

1 module_param(name,type,perm)

a)name:变量名

b)type:数据类型内核支持模块参数类型有:bool、invbool(bool的发转,true变为false,false变为true)、charp(char类型指针值)、int、long、short、uint、ulong、ushort、

c)perm:常见的访问许可值通常为S_IRUGO和S_IWUSR。通常情况下将他们按位或

同时我们也可以用下面的宏声明数组:

1 Module_param_array(name,type,num,perm)

5.模块符号导出

当一个模块要使用另一个模块的函数(变量)的时候,要使用EXPORT_SYMBOL(符号名)或者EXPORT_SYMBOL_GPL(符号名)来申明。

注:EXPORT_SYMBOL_GPL()只适用于遵循GPL协议的模块

l简单内核模块实现

想必大家都记得我们在学习某种语言的时候,写的第一个程序大部分都是输出hello world,所以我接下来用我们刚才介绍的内核模块去完成hello world。

1.内核模块编写

通过上面部分内容的介绍,要完成第一内核模块不是很难,下面是自己的代码。

1 #include

2 #include

3 MODULE_LICENSE("GPL");

4 staticint hello_init(void)

5 {

6 printk("<0> hello world\n");

7 return0;

8 }

9 staticvoid hello_exit(void)

10 {

11 printk("<0> goodbye\n");

12 }

13 module_init(hello_init);//该宏在模块的目标代码中增加一个特殊的段,用于说明内核初始化函数所在的位置

14 module_exit(hello_exit);//跟上面的宏对立

2.Makefile编写

Makefile的编写也比较简单,要注意的地方代码中已经说明。

1 obj-m := hello.o

2 DIRS :=/smbshare/linux-2.6.39///此处路径为内核源码路径,该内核源码必须要经过编译,不然会报错

3 all:

4 make -C $(DIRS) M=$(PWD) modules

5 clean:

6 rm -Rf*.o *.ko *.mod.c *.order *.symvers

经过了上面两个步骤,我们然后编译加载然后卸载我们的模块进行试验。

编译:

98c104915a0711c8ec08b4c1dd079e53.png

加载:

269f68ed7085285f6df47bb03f209a38.png

查看:

3bee59aa9c2af1a5a931532fe9f00009.png

卸载:

7034438f3c6b986f5504f44fdc0d7cb6.png

3.Printk函数简介

printk函数为内核打印函数,其和printf函数功能类似,不过比printf多了打印权限一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):

1 #define KERN_EMERG 0 //紧急事件消息,系统崩溃之前提示,表示系统不可用

2 #define KERN_ALERT 1 //报告消息,表示必须立即采取措施

3 #define KERN_CRIT 2 //临界条件,通常涉及严重的硬件或软件操作失败

4 #define KERN_ERR 3 //错误条件,驱动程序常用KERN_ERR来报告硬件的错误

5 #define KERN_WARNING 4 //警告条件,对可能出现问题的情况进行警告

6 #define KERN_NOTICE 5 //正常但又重要的条件,用于提醒

7 #define KERN_INFO 6 //提示信息,如驱动程序启动时,打印硬件信息

8 #define KERN_DEBUG 7 //调试级别的消息

今天的内容比较简单,只是对内核模块有了一个初步的了解,所以我今天在给大家推荐一个比较好用的工具,叫做exvim其将好多vim的工具进行了集成,个人感觉十分方便,就是换电脑什么的也不怕自己的配置丢失了。贴一张自己使用的图,大家有兴趣的可以去了解。

967390516cc71d2b097c2c27810bb4c9.png

来源:https://www.cnblogs.com/wrjvszq/p/4260996.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值