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 ...
随机推荐
- SQl Server 表链接查询
之前漏下了,这里补一偏 select * from student,score ——笛卡尔积 可以想想成c#里面的多维函数的样子,打印时每一张表的每一条数据都会连带着第二张表的所有数据 两个表的连接: ...
- iOS 地图(添加大头针)
首先在工程中导入MapKit.framework库文件 #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <U ...
- 安装了多个php版本,如何编译扩展
cd /data/php-5.5.35/ext/mysqli 找到安装包目录下面的ext目录 ./configure --with-php-config=/usr/local/php5/bin/ph ...
- QT中显示图像数据
博客转载自:https://blog.csdn.net/lg1259156776/article/details/52325091 一般图像数据都是以RGBRGBRGB……字节流的方式(解码完成后的原 ...
- java全栈day10--接口 多态
接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义与 ...
- ModelSim Simulation of RapidIO II IP Core Demonstration Testbench May Require ld_debug Command
Solution ID: fb83262Last Modified: May 17, 2013Product Category: Intellectual PropertyProduct Area: ...
- [转]CentOS 7.3 安装MySQL
1.下载mysql源 yum -y install wget wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarc ...
- Mac下的UI自动化测试 (四)
在实际写testcase的时候会使用unittest框架,但是在sikuli中需要使用它提供的command来运行,位于/Applications/SikuliX.app/run,使用-r参数指定要运 ...
- Html5代码片段收集
HTML5 启动模板 当启动一个新的项目的时候,你需要一个启动模板.这里是一个简洁干净的模板,可以作为 HTML5 项目的基础. <!DOCTYPE html> <html> ...
- framwork maven的配置及使用
maven的配置及使用 一.什么是maven: 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要 ...