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 ...
随机推荐
- 在异步回调中调用MessageBox.Show
public static void Test() { ThreadStart aThreadStart = delegate() { ); MessageBox.Show("Good!&q ...
- 电脑安装unity3d有C盘逐渐爆满问题解决方案
打开unity3d软件,Edit - Preference - GI Cache选中 Custom Cache Location,切换到别的盘,然后点击 Clean Cache清空一次,再查看C盘,存 ...
- 505C Mr. Kitayuta, the Treasure Hunter
传送门 题目大意 一共有30000个位置,从第0个位置开始走,第一次走k步,对于每一次走步,可以走上一次的ki+1 ,ki ,ki-1步数(必须大于等于1),每个岛上有value,求最大能得到的val ...
- 并没有看起来那么简单leetcode Generate Parentheses
问题解法参考 它给出了这个问题的探讨. 超时的代码: 这个当n等于7时,已经要很长时间出结果了.这个算法的复杂度是O(n^2). #include<iostream> #include&l ...
- Delphi xe6 android Popup控件的使用
1.拖放Label.button和popup控件到form 2.在structure将button1和label1拖到popup1上,然后调整布局就可以 Popup有几个重要的属性: 1.Placem ...
- python(一):作用域
与c相比,python作用域很奇特. 在Python中变量的作用域是由它在源代码中的位置决定的,这一点与c相似. python只支持4种作用域,即局部作用域,全局作用域,内置作用域,嵌套作用域. 比较 ...
- [raspberry pi3] 编译安装chromium
想要试试arm板上使用selenium是不是可能,发现Firefox什么的不顶用,网上有提供的chrome的安装手顺,但是没有arm版本的对应的chromedriver,只能自己搞了. 这边介绍的方法 ...
- ubuntu - 14.04,常用PPA源(第三方提供的deb格式安装文件)!!
说明: 1,下面所有PPA源的执行命令,均为在shell中执行的命令,需要依次执行! 2,下面所有测试方法,均为在shell中执行的命令!! PPA源: 一,Oracle JDK:Oracle公司提供 ...
- Python-OpenCV中VideoCapture类的使用
目录 主要记录Python-OpenCV中的VideoCapture类的使用:官方文档: VideoCapture()是用于从视频文件.图片序列.摄像头捕获视频的类: #!/usr/bin/e ...
- Summer Holiday 强连通
Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity i ...