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 ...
随机推荐
- c++11: thread_local
thread_local变量是C++ 11新引入的一种存储类型.它会影响变量的存储周期(Storage duration),C++中有4种存储周期: automatic static dynamic ...
- cocos2d-js 定时器
1.scheduleUpdate 节点中有scheduleUpdate接口,通过这个接口,可以让游戏在每帧执行都执行update方法 var ScheduleUpdateLayer = cc.Laye ...
- 用StringBuilder来实现经典的反转问题
import java.util.Scanner; public class Practise03 { public static void main(String[] args) { //键盘录入一 ...
- Arduino 002 --- 在Ubuntu(Linux) 中搭建Arduino开发环境
在Ubuntu/Linux 中搭建Arduino开发环境 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 需要安装的Arduino的版本:Arduino 1.6.11(最新版本) ...
- Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes
BZOJ2200 听说加上slf优化的spfa的卡过,真的不想写这些东西. 考虑使用堆优化的dij算法. 先加上所有双向边,然后dfs一下搜出所有由双向边构成的联通块,然后加上所有的单向边,一边对所有 ...
- python3-while与continue
# Auther: Aaron Fan #要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue#执行continue语句,让python忽略余下的代码 #只打印1到10之间 ...
- Mat的迭代器使用
如果你熟悉 C++的 STL 库,那一定了解迭代器(iterator)的使用.迭代器可以方便地遍历所有元素.Mat 也增加了迭代器的支持,以便于矩阵元素的遍历.下面的例程功能跟上一节的例程类似,但是由 ...
- 树莓派研究笔记(1)-- 安装Mono
职业病啊,原谅我,第一步就是要安装Mono搞DOTNET 1. 更新系统 sudo apt-get update 2. 安装 Mono sudo apt-get install mono-comple ...
- 李兴华Java培训系列课程
理解程序设计分层的思想: Dao设计模式的组成以及各部分的开发: 3.具体内容 在本次讲解之中,处理IO的部分暂时不会使用到之外,所有Java的重点的核心部分都会涉及到. 实际上在任何的环境下分层的概 ...
- 形式化方法的逆袭——如何找出Timsort算法和玉兔月球车中的Bug?
https://bindog.github.io/blog/2015/03/30/use-formal-method-to-find-the-bug-in-timsort-and-lunar-rove ...