先看一个最简单的驱动程序:

//hello.c

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. MODULE_LICENSE("Dual BSD/GPL");
  4. static int hello_init(void)
  5. {
  6. printk(KERN_ALERT "hello module!\n");
  7. return 0;
  8. }
  9. static void hello_exit(void)
  10. {
  11. printk(KERN_ALERT "bye module!\n");
  12. }
  13. module_init(hello_init);
  14. 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相关推荐

  1. linux内核驱动模块开发makefile实例解析

    昨天整理了一篇关于linux内核驱动模块的开发介绍入门,其中介绍了一些关于驱动模块的基本开发步骤,不过面广而不深,很多细节都没有涉及到,其中就包括如何编写驱动模块的makefile.那么,今天我们就来 ...

  2. 《Linux内核驱动模块编程指南》

    Foreword Table of Contents 作者声明 版本和注意 感谢 译者注 作者声明 <Linux内核驱动模块编程指南>最初是由Ori Pomerantz为2.2版本的内核编 ...

  3. linux内核驱动模块开发步骤及实例入门介绍

    最近在搞一个linux的项目,其中主要是在编写一些应用模块,对内核及其驱动模块涉及很少,遇到了一些驱动模块的问题时,临时查了些资料,大致了解了一下驱动模块开发的基本步骤和常规步骤,并从网上也收集到了一 ...

  4. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  5. linux驱动模块编译入内核,Linux内核驱动模块编译

    内核模块的构建有两种主要方式:放在内核源码树中或者放在内核代码外. 一.放在内核源码树中 在内核的drivers/文件夹下创建好驱动模块文件夹,并完成驱动文件之后,需要编辑和修改相应的Kconfig和 ...

  6. Linux内核驱动模块如何添加math.h

    结论 Linux内核空间无法调用C库函数并且禁用FPU,可以放弃了. 原因:内核这么设计有利于上下文切换和调度. 解决方法 尝试过手动实现某些三角函数到我的文件中.发现只要涉及浮点数,虽然编译时不会e ...

  7. linux 内核驱动模块的编译及加载

    主机:Windows 7旗舰版,VMware7.1.2,Fedora9 编译环境:arm-linux-gcc 4.4.3 Linux版本:linux-2.6.32.2 busybox版本:busybo ...

  8. 十三、linux 内核驱动模块传参数

    在加载模块的时候,可以向它传参数. 单个参数: 内核模块可以通过module_param来传单个参数 – module_param(name,type,perm)                 – ...

  9. 如何在linux内核中增加对应的Makefile和Kconfig选项?

    1.在上一级目录的Kconfig中选项如下: config XXXX         bool "YYYY"         default y         help     ...

最新文章

  1. 【Modern OpenGL】摄像机系统 Camera
  2. Primes on Interval(CF-237C)
  3. 打印工资条怎么做到每个人都有表头明细_一分钟生成500人的工资条?还有2种方法?...
  4. Android SlidingMenu开源库及其使用
  5. mysql 5.6的安装
  6. 台式计算机如何连接网络,台式机如何去连接网络
  7. 外行人都能看得懂的机器学习,错过了血亏!
  8. springboot下载resources目录下的文件
  9. 故障树最小割集程序化设计方案
  10. 利用css来制作轮播图
  11. Martin Fowler微服务论文--译文
  12. 最低成本DIY视频遥控车方案:ESP32-CAM视频遥控车
  13. 在uniapp的小程序中使用自己的字体库
  14. VM中的Ubuntu能ping通外网浏览器不能上网
  15. 马云:你穷,是因为你没有极度渴望成为成功的野心
  16. Selenium-鼠标和键盘操作
  17. 爬虫练习(3)-- 36Kr 站点正则和 ajax 混合
  18. 疫情过后:表面一切照旧,暗里风起云涌!
  19. Lifecycle与LiveData的珠联璧合
  20. Asp.Net读取excel文件的时候 出错提示:外部表不是预期的格式 解决方案

热门文章

  1. SpringBoot热加载实现与类加载浅谈
  2. 运行npm install命令后的执行过程
  3. vlan trunk中继链路(讲解+配置)
  4. Android udp json+数组 ---gt;bytes发送数据
  5. 面试刷题7:int和Integer有什么区别?
  6. TensorFlow 笔记1 Mac Python环境搭建
  7. WeChat.app debuger
  8. 2019年JavaScript状态调查中的新增功能
  9. funcode马里奥_MacGyvering马里奥·奥德赛跳绳挑战赛
  10. matlab设置背景颜色