Linux内核分析(二)----内核模块简介|简单内核模块实现
原文:Linux内核分析(二)----内核模块简介|简单内核模块实现
Linux内核分析(二)
昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某种意义上来说linux系统本身就是由一个个模块构成的,所以我会结合内核模块的设计,去分析内核,从而达到对linux内核的理解。
今天我们会分析到以下内容:
1. Linux内核模块简介
2. 简单内核模块实现
l Linux内核模块简介
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宏来声明具体如下:
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。通常情况下将他们按位或
同时我们也可以用下面的宏声明数组:
- Module_param_array(name,type,num,perm)
5. 模块符号导出
当一个模块要使用另一个模块的函数(变量)的时候,要使用EXPORT_SYMBOL(符号名)或者EXPORT_SYMBOL_GPL(符号名)来申明。
注:EXPORT_SYMBOL_GPL()只适用于遵循GPL协议的模块
l 简单内核模块实现
想必大家都记得我们在学习某种语言的时候,写的第一个程序大部分都是输出hello world,所以我接下来用我们刚才介绍的内核模块去完成hello world。
1. 内核模块编写
通过上面部分内容的介绍,要完成第一内核模块不是很难,下面是自己的代码。
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("GPL");
staticint hello_init(void)
{
printk("<0> hello world\n");
return0;
}
staticvoid hello_exit(void)
{
printk("<0> goodbye\n");
}
module_init(hello_init);//该宏在模块的目标代码中增加一个特殊的段,用于说明内核初始化函数所在的位置
module_exit(hello_exit);//跟上面的宏对立
2. Makefile编写
Makefile的编写也比较简单,要注意的地方代码中已经说明。
obj-m := hello.o
DIRS :=/smbshare/linux-2.6.///此处路径为内核源码路径,该内核源码必须要经过编译,不然会报错
all:
make -C $(DIRS) M=$(PWD) modules
clean:
rm -Rf*.o *.ko *.mod.c *.order *.symvers
经过了上面两个步骤,我们然后编译加载然后卸载我们的模块进行试验。
编译:

加载:

查看:

卸载:

3. Printk函数简介
printk函数为内核打印函数,其和printf函数功能类似,不过比printf多了打印权限一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):
#define KERN_EMERG 0 //紧急事件消息,系统崩溃之前提示,表示系统不可用
#define KERN_ALERT 1 //报告消息,表示必须立即采取措施
#define KERN_CRIT 2 //临界条件,通常涉及严重的硬件或软件操作失败
#define KERN_ERR 3 //错误条件,驱动程序常用KERN_ERR来报告硬件的错误
#define KERN_WARNING 4 //警告条件,对可能出现问题的情况进行警告
#define KERN_NOTICE 5 //正常但又重要的条件,用于提醒
#define KERN_INFO 6 //提示信息,如驱动程序启动时,打印硬件信息
#define KERN_DEBUG 7 //调试级别的消息
今天的内容比较简单,只是对内核模块有了一个初步的了解,所以我今天在给大家推荐一个比较好用的工具,叫做exvim其将好多vim的工具进行了集成,个人感觉十分方便,就是换电脑什么的也不怕自己的配置丢失了。贴一张自己使用的图,大家有兴趣的可以去http://exvim.github.io/ 了解。

Linux内核分析(二)----内核模块简介|简单内核模块实现的更多相关文章
- Linux内核分析:完成一个简单的时间片轮转多道程序内核代码
PS.贺邦 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 1.m ...
- linux 内核分析+使用SystemTap调试新增内核模块
http://blog.chinaunix.net/uid/14528823/list/1.html?cid=189394
- Linux内核分析(九)——总结篇
序:写在前面的话 本次内容作为Linux内核的总结内容,主要涉及对Linux系统的总体的一些理解,同时将之前的一些总结贴出来作为大家的一个索引,希望笔者的博客能对和笔者一样的菜鸟有一些帮 ...
- Linux内核分析——构造一个简单的Linux系统MenuOS
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...
- 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...
- Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装
原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...
- 《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS
郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统Me ...
- Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥
一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...
随机推荐
- 二分图行列匹配---> hdu2119,hdu1498
hdu2119 题意:给定一个矩形方格,每个格子里面的数字是0或者1,每次操作可以把一整行或列的1变成0,问最少多少次操作能将1全部变为0 一次可以消除某一行或者某一列的1但是可以这么想,最多有多少个 ...
- Oracle学习(十四):管理用户安全性
--用户(user) SQL> --创建一个名为 grace password是password 的用户,新用户没有不论什么权限 SQL> create user grace identi ...
- dedecms 织梦显示时间格式
field:pubdate function=GetDateMK(@me)/] 2009-11-10 [field:pubdate function=GetDateTimeMK(@me)/] 2009 ...
- 足球和oracle列(4):巴西惨败于德国,认为,差额RAC拓扑控制!
足球与oracle系列(4):从巴西慘败于德国,想到,差异的RAC拓扑对照! 前期回想: 本来想说今晚,回头一想,应该是今早第二场半决赛就要开战了!先来回味一下之前的比赛,本届8支小组赛第一名已经所有 ...
- BootStrap -- Grid System
<script src="jquery.1.9.js"></script> <script src="js/bootstrap.min.js ...
- rsync+inotify 实现资源服务器的同步目录下的文件变化时,备份服务器的同步目录更新,以资源服务器为准,去同步其他客户端
测试环境: 资源服务器(主服务器):192.168.200.95 备份服务器(客户端):192.168.200.89 同步目录:/etc/test 同步时使用的用户名hadoop密码12345 实验目 ...
- linux文件打开模式
文件打开 int open(const char *pathname, int flags, mode_t mode); 普通方式(Canonical mode) flags中没有设置O_SYN ...
- window.history.back()的改进方法window.history.go()
今天在做项目时,測试人员提出了一条bug,起初没当回事,在改动过程中才意识到其重要性,故记录下来. 依照需求,系统应该实现例如以下的功能:有三个关联的页面a.aspx(简称a),b.aspx(简称b) ...
- 采用Java语言如何实现高速文件复制?
今天review代码也看到了"大神"用老方法来实现文件拷贝.今天归结一下使用Java语言怎样实现高速文件复制: 代码1--使用文件通道的方式: import java.io.Fil ...
- Peter's Hobby
主题链接 题意: 题意比較麻烦.. .n天,给出每天的叶子的一种状态(Dry , Dryish , Damp and Soggy),最有可能出现的天气序列(Sunny, Cloudy and Rain ...