Linux内核驱动模块示例--Helloword及Makefile
先看一个最简单的驱动程序:
//hello.c
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("Dual BSD/GPL");
- static int hello_init(void)
- {
- printk(KERN_ALERT "hello module!\n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ALERT "bye module!\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
一个linux内核模块主要由如下几个部分组成:
(1)module加载函数。
当通过insmod或modprobe命令加载内核module时,module的加载函数会自动被内核运行,完成本module的相关初始化工作。
module加载函数通过module_init()函数向内核注册。
(2)module卸载函数。
rmmod命令卸载某个模块时,模块的卸载函数会自动被内核执行,完成本模块初始化的相反功能。
module卸载函数通过module_exit()函数向内核注册。
(3)module许可声明(必须)
许可证license声明描述内核模块的许可权限,如果不声明license,模块被加载时,将,收到内核被污染(kernel tainted)的警告。linux中可接受的license包括“GPL”,“GPL v2”,“Dual BSD/GPL”,“Dual MPL/GPL”等。
多数情况下,内核模块应遵循GPL兼容许可权,2.6内核模块最常见的是以MODULE_LICENSE("Dual BSD/GPL")语句声明模块采用BSD/GPL 双LICENSE。
(4)模块参数(可选)
(5)模块到处符号(可选)
(6)模块作者等信息声明(可选),如MODULE_AUTHOR(),MODULE_DESCRIPTION(),MODULE_ALIAS()等。
编译得到hello.ko,然后insmod hello.ko加载模块,rmmod hello.ko 卸载模块。
linux内核的整体结构已经非常庞大,而其包含的组件也非常多,有两种方法把需要的部分都包含在内核中
一,把所有功能都编译进内核,但这回导致两个问题,生成的内核会特别打,假如要把现在的内核增加或删除功能,将不得不重新编译整个内核。
二,使用模块module,上述我们写的最简单驱动,就是一个模块module,可以随意的增加或删除。
怎样把hello.c源文件编译成helo.ko内核模块呢,同样使用make,但这里的Makefile与一般的应用程序Makefile有所不同,驱动Makfile要指定内核源代码位置,先看一个简单的驱动Makefile:
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:rm *.o *.ko *.mod.c
.PHONY:clean
KERNEL_DIR为内核源代码build目录,我们知道,内核存放在/usr/src中,/lib/modules其实是连接到这个地方,在shell中执行uname -r会得到正在使用的完整内核版本号,这样就选择了适当的内核源码。
PWD为源文件hello.c所在目录。
make -C (大写C) make会进入KERNEL_DIR目录执行此目录下的Makefile,然后在返回PWD目录执行自己写的Makefile。
在终端中make
[root@localhost driver]# make
make -C /lib/modules/2.6.9-89.ELsmp/build SUBDIRS=/root/linux/driver modules
make[1]: Entering directory `/usr/src/kernels/2.6.9-89.EL-smp-i686'CC [M] /root/linux/driver/hello.oBuilding modules, stage 2.MODPOSTCC /root/linux/driver/hello.mod.oLD [M] /root/linux/driver/hello.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.9-89.EL-smp-i686'
这样hello.ko驱动模块就产生好了,insmod加载
[root@localhost driver]# insmod hello.ko
lsmod一下就会看到hello模块的存在了,并且在系统的日志/var/log/messages中会记录模块的输出,也就是
printk(KERN_ALERT "hello module!\n");
输出的helo module!
[root@localhost driver]#tail -1 /var/log/messages
Oct 13 11:27:07 localhost kernel: hello module!
rmmod helle 卸载hello.ko
一般驱动Makefile会写得更复杂一点,这个再研究。
转载自:https://blog.csdn.net/ghostyu/article/details/6869138
Linux内核驱动模块示例--Helloword及Makefile相关推荐
- linux内核驱动模块开发makefile实例解析
昨天整理了一篇关于linux内核驱动模块的开发介绍入门,其中介绍了一些关于驱动模块的基本开发步骤,不过面广而不深,很多细节都没有涉及到,其中就包括如何编写驱动模块的makefile.那么,今天我们就来 ...
- 《Linux内核驱动模块编程指南》
Foreword Table of Contents 作者声明 版本和注意 感谢 译者注 作者声明 <Linux内核驱动模块编程指南>最初是由Ori Pomerantz为2.2版本的内核编 ...
- linux内核驱动模块开发步骤及实例入门介绍
最近在搞一个linux的项目,其中主要是在编写一些应用模块,对内核及其驱动模块涉及很少,遇到了一些驱动模块的问题时,临时查了些资料,大致了解了一下驱动模块开发的基本步骤和常规步骤,并从网上也收集到了一 ...
- xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持
Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...
- linux驱动模块编译入内核,Linux内核驱动模块编译
内核模块的构建有两种主要方式:放在内核源码树中或者放在内核代码外. 一.放在内核源码树中 在内核的drivers/文件夹下创建好驱动模块文件夹,并完成驱动文件之后,需要编辑和修改相应的Kconfig和 ...
- Linux内核驱动模块如何添加math.h
结论 Linux内核空间无法调用C库函数并且禁用FPU,可以放弃了. 原因:内核这么设计有利于上下文切换和调度. 解决方法 尝试过手动实现某些三角函数到我的文件中.发现只要涉及浮点数,虽然编译时不会e ...
- linux 内核驱动模块的编译及加载
主机:Windows 7旗舰版,VMware7.1.2,Fedora9 编译环境:arm-linux-gcc 4.4.3 Linux版本:linux-2.6.32.2 busybox版本:busybo ...
- 十三、linux 内核驱动模块传参数
在加载模块的时候,可以向它传参数. 单个参数: 内核模块可以通过module_param来传单个参数 – module_param(name,type,perm) – ...
- 如何在linux内核中增加对应的Makefile和Kconfig选项?
1.在上一级目录的Kconfig中选项如下: config XXXX bool "YYYY" default y help ...
最新文章
- 【Modern OpenGL】摄像机系统 Camera
- Primes on Interval(CF-237C)
- 打印工资条怎么做到每个人都有表头明细_一分钟生成500人的工资条?还有2种方法?...
- Android SlidingMenu开源库及其使用
- mysql 5.6的安装
- 台式计算机如何连接网络,台式机如何去连接网络
- 外行人都能看得懂的机器学习,错过了血亏!
- springboot下载resources目录下的文件
- 故障树最小割集程序化设计方案
- 利用css来制作轮播图
- Martin Fowler微服务论文--译文
- 最低成本DIY视频遥控车方案:ESP32-CAM视频遥控车
- 在uniapp的小程序中使用自己的字体库
- VM中的Ubuntu能ping通外网浏览器不能上网
- 马云:你穷,是因为你没有极度渴望成为成功的野心
- Selenium-鼠标和键盘操作
- 爬虫练习(3)-- 36Kr 站点正则和 ajax 混合
- 疫情过后:表面一切照旧,暗里风起云涌!
- Lifecycle与LiveData的珠联璧合
- Asp.Net读取excel文件的时候 出错提示:外部表不是预期的格式 解决方案