一、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宏来声明具体如下:

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. 1 Module_param_array(name,type,num,perm)

5. 模块符号导出

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

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

二、简单内核模块实现

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

1. 内核模块编写

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

#include<linux/init.h>2 #include<linux/module.h>3 MODULE_LICENSE("GPL");4 staticint hello_init(void)5 {6 printk("<0> hello worldn");7 return0;8 }9 staticvoid hello_exit(void)
10 {
11 printk("<0> goodbyen");
12 }
13 module_init(hello_init);//该宏在模块的目标代码中增加一个特殊的段,用于说明内核初始化函数所在的位置
14 module_exit(hello_exit);//跟上面的宏对立
复制代码

2. Makefile编写

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

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

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

编译:

加载:

查看:

卸载:

3. Printk函数简介

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

 #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的工具进行了集成,个人感觉十分方便,就是换电脑什么的也不怕自己的配置丢失了。贴一张自己使用的图,大家有兴趣的可以去http://exvim.github.io/ 了解。


首先恭喜您,能够认真的阅读到这里,如果对部分理解不太明白,建议先将文章收藏起来,然后对不清楚的知识点进行查阅,然后在进行阅读,相应你会有更深的认知。如果您喜欢这篇文章,就点个赞或者【关注我】吧!!

_Linux内核分析(二)-内核模块简介和简单内核模块实现相关推荐

  1. linux内核调用( )为进程创建虚存区_Linux内核分析-总结篇(九)

    本次内容作为Linux内核的总结内容,主要涉及对Linux系统的总体的一些理解,同时将之前的一些总结贴出来作为大家的一个索引,希望笔者一样的菜鸟有一些帮助和入门的作用.从一个初学者的角度对Linux有 ...

  2. linux 带ifdef运行程序_Linux内核分析——可执行程序的装载

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周   可执行程序的装 ...

  3. linux内核体系学习路径_Linux内核分析(一)linux体系简介|内核源码简介|内核配置编译安装...

    从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底,同时在博文中如果那些地方有问题还请各位大神为我讲解. 今天我们会分析到以下内容: 1. Linux体系结构简介 ...

  4. linux操作系统原理_Linux内核分析-操作系统是如何工作的(二)

    linux操作系统的主要构架如图1所示,我们知道,操作系统是通过管理CPU进程.存储器.文件系统.设备驱动.以及网络接口等相关部分来工作的,我们这里主要是通过分析关于CPU的操作即进程的管理执行来分析 ...

  5. Linux内核分析(二) 段页式分析

    80386CPU 页式存储管理机制 关于80386段式管理,也是Linux内核采用的段式管理部分已在硬件平台分析给出了详细分析(段式存储管理). 接着我们详细分析建立在段机制上的 80386CPU 页 ...

  6. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  7. linux内核分析 网络九,“Linux内核分析”实验报告(九)

    一 Linux内核分析博客简介及其索引 本次实验简单的分析了计算机如何进行工作,并通过简单的汇编实例进行解释分析 在本次实验中 通过听老师的视频分析,和自己的学习,初步了解了进程切换的原理.操作系统通 ...

  8. 《Linux内核分析》(二)——从一个简单Linux内核分析进程切换原理

    转载:https://blog.csdn.net/FIELDOFFIER/article/details/44280717 <Linux内核分析>MOOC课程http://mooc.stu ...

  9. 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

最新文章

  1. java代码连接oracle数据库连接_在JAVA中连接Oracle数据库(例子)
  2. VLC-DSS搭建直播系统中链路断开影响测试
  3. quality center 支持的平台
  4. mysql数据库上传ftp服务器中_备份部分mysql表并上传至指定ftp服务器目录中
  5. 微信小程序点击按钮实现弹出模态框
  6. golang中的go mod开发
  7. FPGA学习之路—接口(1)—URAT Verilog程序设计
  8. 阿里云Kubernetes服务上从零搭建GitLab+Jenkins+GitOps应用发布模型的实践全纪录
  9. python xmlrpc_Python xmlrpc用法
  10. stats | 数据降维之主成分分析(PCA)
  11. python脚本打包成linux命令_python怎么打包生成linux命令行可用软件?
  12. JPA映射组合主键时错误:No default constructor for entity
  13. 使用 Python 进行线性搜索优化
  14. 速达服务器启动时显示对象名ACCSET无效
  15. Java中使用正则表达式
  16. android 多语言国家化对照表(超详细)
  17. ​​欧洲能源危机日益严重,这个冬天到底会有多 “冷” ?
  18. 网盘容量背后的技术秘密
  19. 土豆linux,土豆里安装linux是什_土豆发芽图片
  20. qq大学认证如何修改随意修改认证内容

热门文章

  1. Junk-Mail Filter_并查集(hdu 2473)
  2. 江西师范大学2017年C语言考试,2018年江西师范大学程序设计(C语言)考研初试大纲...
  3. python 代码段的标志_Python代码类型标志
  4. 今晚直播丨2020年全国首场12c OCM直考揭秘
  5. Oracle 20c 新特性:缺省的只读 Oracle HOME 支持
  6. 8种最坑的SQL错误用法,你有没有踩过坑?
  7. 数据库流行度8月排行榜:Oracle 飙升 和 PostgreSQL 绝尘领跑第二梯队
  8. 算法分析:Oracle 11g 中基于哈希算法对唯一值数(NDV)的估算
  9. 一文讲透数仓临时表的用法
  10. 云图说|ASM灰度发布,让服务发布变得更敏捷、更安全