Linux内核模块简单示例
1. Linux 内核的整体结构非常庞大,其包含的组件也非常多,使用这些组件的方法有两种:
① 直接编译进内核文件,即zImage或者bzImage(问题:占用内存过多)
② 动态添加
* 模块本身并不被编译进内核文件
* 根据需求,在内核运行期间动态安装或卸载
2. 内核模块动态安装与卸载
①安装 insmod
例:insmod /home/dnw_usb.ko
②卸载 rmmod
例:rmmod dnw_usb
③查看 lsmod
例: lsmod
3. 模块声明
① MODULE_LICENSE()
② MODULE_AUTHOR()
③ MODULE_DESCRIPTION()
④ MODULE_VERSION()
4. 模块参数
① 模块参数用于在加载模块时传递参数给模块
② 通过宏module_param指定保存模块参数的变量
module_param(name, type, perm)
* name:变量的名称
* type:变量类型。bool:布尔型,int:整型,charp:字符串型
* perm是访问权限。S_IRUGO:读权限,S_IWUSR:写权限
③ 简单示例
int a = ;
char* ptr = NULL;
module_param(a, int, SIRUGO);
module_param(ptr, charp, SIRUGO);
命令行:insmod xxx.ko a=10 ptr="HelloWorld"
5. 符号导出
① 如果内核模块中的函数或者全局变量想让其他模块使用,必须进行导出
② 内核符号导出使用宏
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名)
注:其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块
6. 内核模块简单示例
① 模块代码:
#include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kevin Wu");
MODULE_DESCRIPTION("For study Linux module");
MODULE_VERSION("1.0"); int a = ;
char* ptr = NULL; module_param(a, int, S_IRUGO);
module_param(ptr, charp, S_IRUGO); static int hello_init()
{
printk(KERN_WARNING"Hello world initlizing\n");
printk(KERN_WARNING"a = %d\n", a);
printk(KERN_WARNING"ptr = %s\n", ptr); return ;
} static void hello_exit()
{
printk(KERN_WARNING"Hello world exiting\n");
} module_init(hello_init);
module_exit(hello_exit);
② Makefile:
obj-m := helloworld.o KDIR := /home/Linux/Kernal/linux-2.6. all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm clean:
rm -f *.o *.ko *.order *.symvers
Linux内核模块简单示例的更多相关文章
- Linux 编程简单示例代码
Linux进程管理 编辑a.c 文件 #include <stdio.h> #include <unistd.h> int main() { printf( "Mes ...
- Linux内核模块编程与内核模块LICENSE -《具体解释(第3版)》预读
Linux内核模块简单介绍 Linux内核的总体结构已经很庞大,而其包括的组件或许多.我们如何把须要的部分都包括在内核中呢?一种方法是把全部须要的功能都编译到Linux内核.这会导致两个问题.一是生成 ...
- Linux字符设备简单示例
1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.例如:串口.Led.按键等. 2. 通过字符设备文件 ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux I2C驱动--用户态驱动简单示例
1. Linux内核支持I2C通用设备驱动(用户态驱动:由应用层实现对硬件的控制可以称之为用户态驱动),实现文件位于drivers/i2c/i2c-dev.c,设备文件为/dev/i2c-0 2. I ...
- Linux内核模块简介
一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...
- linux 内核模块开发相关的文章搜集和模块开发过程中的小技巧
最近需要开发一些内核模块,进行探究linux内核的一些特征,现在把一些遇到的比较好的文章和知识点,进行简要记录和备忘: 内核模块开发相关链接: https://www.thegeekstuff.com ...
- Linux内核模块学习
注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...
- 爹地,我找到了!,15个极好的Linux find命令示例
爹地,我找到了!, 15个极好的Linux find命令示例 英文原文:Daddy, I found it!, 15 Awesome Linux Find Command Examples 标签: L ...
随机推荐
- TCP UDP HTTP 的关系和区别
TCP UDP HTTP 三者的关系: TCP/IP是个协议组,可分为四个层次:网络接口层.网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传 ...
- 关于fragment生命周期的两张图片
图1,fragment的生命周期,图2,fragment生命周期对应activity的生命周期
- serializeArray()和.serialize()的区别、联系
serializeArray()和.serialize()的区别.联系 <form id='addForm' action='UserAdd.action' type='post'> ...
- (数组)对数组中的数字加1(plus one)
题目:https://www.nowcoder.com/practice/4d135ddb2e8649ddb59ee7ac079aa882?tpId=46&tqId=29111&tPa ...
- 手把手教Android商业项目-即时通讯-i美聊
[课程概况] 手把手教你从无到有的完整实现一个Android商业项目,是目前整个市场上所没有的课程,废话不多说,请往下看. [项目概况] 项目名称:i美聊 所属领域:移动社交 即时通讯 代码行数: ...
- UCOSIII优先级
优先级 0:中断服务管理任务 OS_IntQTask() 优先级 1:时钟节拍任务 OS_TickTask() 滴答定时器任务 优先级 2:定时任务 OS ...
- mybatis spring maven
maven版本:3.3.9 解压即可使用 spring版本:4.3.9 通过maven进行管理下载 mybatis版本:3.4.4 通过maven进行管理下载 mysql版本:5.7 conne ...
- sqlserver高版本还原到低版本方法
想要将Sqlserver2014高版本备份的数据还原到低版本SqlServer2008R2上去,但是这在SqlServer中是没法直接还原数据库的,通过以下方法可以顺利还原. 通过高版本生成sql脚本 ...
- Flink on Yarn模式启动流程分析
此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Flink On Yarn 架构 Paste_Image.png 前提条件首先需要配置YARN_CONF_DI ...
- Dubbo接口测试方法及步骤
1)打开soapUI,点击File--New project: 2)右键New REST service from URL,注:因为dubbo接口不像http接口一样有URL,所以这里的URL可以随便 ...