5.linux内核模块基础,内核模块学习
linux内核模块基础
一、定义
Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法
1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会导致一个问题:占用内存过多.
2.有一种机制能让内核文件本身并不包含某组件,而是在该组件需要被使用的时候,动态地添加到正在运行的内核中。
内核模块特点:
1.模块本身并不被编译进内核文件(zImage 或者 bzImage)。
2. 可以根据需求,在内核运行期间动态的安装或卸载。
3.基本上是以.ko 结尾。
二、内核安装与卸载命令
1.安装 insmod
例:insmod *.ko
2. 卸载 rmmod
例:rmmod *
3. 查看 lsmod
例:lsmod
三、内核模块设计
1.内核模块没有 main 函数
2.它的入口(加载函数):module_init()
3.出口(卸载函数):module_exit()
4. 必须包含头文件:
#include <linux/init.h>
#include <linux/module.h>
四、代码编写
4.1源码编写
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("GPL");
- static int hello_init(void)
- {
- printk(KERN_WARNING"hello wmx!\n");
- return ;
- }
- static void hello_exit(void)
- {
- printk(KERN_WARNING"Goodbye wmx!\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
4.2Makefile编写
- obj-m :=wmx.o
- KDIR :=/home/kernel/kernel/linux-ok6410
- all :
- make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
- clean :
- rm -rf *.o *.ko *.order *.symvers
其中:
obj-m:指定内核模块最终产生的名字
如果是多个源文件组成的则要:
obj-m:=wmx.o
wmx-objs:=file1.o file2.o file3.o
KDIR:=内核代码路径变量
-C:(change Directory)表示进入后面路径
M:内核模块代码路径
M= $ (pwd):是指要编译的内核模块的源程序在那个目录下,$(PWD)指与Makefile 在同一目录下,也就是当前目录。(pwd 命令的作用是:print work directory).
modules:指明要按照内核模块的方式编译。modules 实际上是$(KDIR)目录下
的 Makefile 的一个 Target 入口.
CROSS_COMPILE:指定编译器
ARCH:指定运行环境
五、运行安装和卸载
1.使用 make 进行编译
2.将生成的.ko复制到nfs挂载的目录下面
3.进入串口控制台操作
3.1安装:
insmod wmx.ko
3.2卸载:(注意这里没有后缀.ko)
rmmod wmx
3.2.1卸载过程如果出现错误:
3.2.2新建目录
mkdir -p /lib/modules/$(uname -r)
六、内核模块选项学习
6.1模块申明
1、MODULE_LICENSE(”遵守的协议”) 申明该模块遵守的许可证协议,如:“GPL“、”GPL v2“等
2、MODULE_AUTHOR(“作者”) 申明模块的作者
3、MODULE_DESCRIPTION(“模块的功能描述") 申明模块的功能
4、MODULE_VERSION("V1.0") 申明模块的版本
6.2模块参数
通过宏 module_param 指定保存模块参数的变量。模块参数用于在加载模块时传递参数给模块。
module_param(name,type,perm)
name:变量的名称
type:变量类型,bool:布尔型 int:整型 charp:字符串型
perm 是访问权限。S_IRUGO:读权限 S_IWUSR:写权限
例:int a = 3; char *st;
module_param(a,int, S_IRUGO);
module_param(st,charp, S_IRUGO);
- int a=;
- module_param(a,int, S_IRUGO|S_IWUSR);
- static int hello_init(void)
- {
- printk(KERN_WARNING"hello wmx!\n");
- printk(KERN_WARNING"a is:%d\n",a);
- return ;
- }
编译安装内核模块时传递变量值:
# insmod wmx.ko a=10
输出:
hello wmx!
a is:10
6.3符号导出
在一个内核模块中实现一个变量或者参数,如果要在其他内核模块中要使用变量或者参数则要将其声明为外部可使用。就要使用内核符号导出:
1.使用宏 EXPORT_SYMBOL(符号名)
2.EXPORT_SYMBOL_GPL(符号名)
其中 EXPORT_SYMBOL_GPL 只能用于包含 GPL 许可证的模块。
使用实例:
外部文件使用该标示符时必须先申明为外部标示符:extern …
在wmx.c文件中:
- void jj()
- {
- printk(KERN_WARNING"love jj!\n");
- }
- EXPORT_SYMBOL(jj);
在jj.c文件中:
- extern jj();
- static int init(void)
- {
- jj();
- return ;
- }
然后先运行insmod wmx.ko
接着在运行:insmod jj.ko
结果如下:
5.linux内核模块基础,内核模块学习的更多相关文章
- 【linux】基础知识学习
[版本] 两种:内核版本 . 发行版本 内核版本从 www.kernel.org 查看 发行版本: 1.retHat, centOS 更稳定,更安全,适宜做企业服务器 2.ubuntu, Debian ...
- Linux网络编程&内核学习
c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...
- (转)Linux基础知识学习
Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...
- 20135231 —— Linux 基础入门学习
20135231 何佳 学习计时:共12小时 读书:5 代码:2 作业:2 博客:3 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ...
- Linux驱动设计—— 内核模块(一)
Linux内核理论基础 组成Linux内核的5个子系统:进程调度(SCHED)/内存管理(MM)/虚拟文件系统(VFS)/网络接口(NET)/进程间通信(IPC). 进程调度(SCHED) 在设备驱动 ...
- linux基础命令学习笔记(二)
linux基础命令学习笔记(二) 1.kill :终止进程 kill pid (唯一标示一个进程) kill -9 强制终止 kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...
- 安装Linux系统,学习Linux操作基础
20189230杨静怡 2018-2019-2 <移动平台开发实践>第1周学习总结 安装Linux系统内容总结 一.学习"基于VirtualBox虚拟机安装Ubuntu图文教程& ...
- [转帖] Linux运维基础知识学习内容
原作者地址:https://www.cnblogs.com/chenshoubiao/p/4793487.html 最近在学习 linux 对简单的命令有所掌握 但是 复杂的脚本 shell pyt ...
- VBox&vmware虚拟机安装Linux及Linux基础入门学习
VBox&vmware虚拟机安装Linux及Linux基础入门学习 通过VMware workstation安装Linux 在安装虚拟机之前,我特意上网搜索了一下目前常使用的虚拟机软件,了解了 ...
随机推荐
- ip netns相关命令
1.增加虚拟网络命名空间 ip netns add net0 2.显示所有的虚拟网络命名空间 EULER:~ # ip netns list net0 也可通过查看/var/run/netns ...
- Oracle: SQL组合不同字段作为一个查询条件
前端程序传过来的值是有三个字段组合之后的结果,后端程序处理,并且将查询的数据反馈给前端. PS:不能直接使用字段RPT_NO的,因为在这条记录中RPT_NO恰好等于其他三个字段的组合值. 正确的做法是 ...
- 解读Unity中的CG编写Shader系列四(unity中的圆角矩形shader)
转自 http://www.itnose.net/detail/6097625.html 上篇文章中我们掌握了表面剔除和剪裁模式 这篇文章将利用这些知识实现一个简单的,但是又很常用的例子:把一张图片做 ...
- Java中的Comparable接口和Comparator接口
Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...
- window.parent 与 window.opener
window.parent针对iframe,window.opener针对window.open 父页面parent.jsp: <%@ page language="java" ...
- hdu3038(带权并查集)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...
- java 小数点处理
public class Test { public static void main(String[] args) { double i = 3.856; // 舍掉小数取整 System.out. ...
- NYOJ题目1051simone牌文本编辑器
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAKFCAIAAABeD4iTAAAgAElEQVR4nO3dO3LjOtOA4X8TzrUQx1
- PHP之MVC项目实战
本文主要包括以下内容 类文件自动加载 路径管理 页面跳转 注册自动加载方法 配置文件系统 cookie session 类文件自动加载 在PHP中使用别的类时,需要载入类文件,如果类很多的话,需要重复 ...
- python中使用chrome进行自动化测试,浏览器变量设置