Linux驱动可以直接编译进内核,也可以以模块的形式进行加载,前者比较复杂,本文就以模块的形式加载!

vi helloi_driver.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int __init hello_init(void)
{
printk(KERN_ALERT "hello driver init!\n");
return 0;
}

static void __exit hello_exit(void)
{
printk(KERN_ALERT "hello driver exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

程序很简单,没有什么说的。关键时驱动的Makefile文件。

ifneq ($(KERNELRELEASE),)

obj-m :=hello_driver.o

else

KERNELDIR ?=/lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

clean:
rm -rf *.o *~ .depend .* .

分析上述Makefile文件,KERNELRELEASE时内核源代码顶层所定义的一个变量,当Makefile第一次执行时,这个变量并没有定义,因此直接执行else中的内容,uname -r命令输出当前系统所使用的版本号,/lib/modules/$(shell uname -r)/build这个就是Linux源码所在的目录,当执行到modules时,-C $(KERNELDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。

当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。

obj-m后面跟的就是最终的模块名,hello_driver.o,make 会在该目录下自动找到hello_driver.c文件进行编译

hello_driver.o可能依赖多个文件或者模块,那么在obj-m后面就可以添加下面语句hello _driver-objs:=file.o file1.o

modules目标指向obj-m变量中设定的模块。

最后通过insmod加载驱动模块,用rmmod卸载模块,此外还有两个关于模块的命令:lsmod modprob modinfo,lsmod用来列出所有的模块,modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。

上面加载模块的例子在加载和卸载的过程中,就会有信息输出,通过dmesg打印输出。

转载于:https://www.cnblogs.com/mingzhang/p/9094111.html

linux 驱动程序 HelloWorld相关推荐

  1. Linux驱动程序学习步骤

     了解linux驱动程序技巧学习的方法很重要,学习linux操作系统时,你可能会遇到关于驱动方面的问题, 这里将介绍学习linux驱动程序的方法,在这里拿出来和大家分享一下. 1.学会写简单的make ...

  2. Linux 驱动程序介绍

     知识结构: 1.       Linux驱动程序设计规范 50% 2.       内核相关知识 25% 3.       硬件相关知识 25% 学习方法: 理论->实验-(疑问)->理 ...

  3. Linux驱动程序编写

    工作需要写了我们公司一块网卡的Linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微 软垄断的强有力武器,日益受到大家的喜爱.真希望她能在中国迅速成长.把程序文档贴出来, ...

  4. linux驱动程序是什么,简述一个Linux驱动程序的主要流程与功能

    1. 简述一个Linux驱动程序的主要流程与功能. 2. 请列举一个软件中时间换空间或者空间换时间的例子. void swap(int a,int b) { int c; c=a;a=b;b=a; } ...

  5. 编写linux驱动程序步骤

    一.建立Linux驱动框架(装载.卸载Linux驱动) Linux内核在使用驱动时首先要装载驱动,在装载过程中进行一些初始化动作(建立设备文件.分配内存等),在驱动程序中需提供相应函数来处理驱动初始化 ...

  6. poll接口《来自Linux驱动程序开发实例》

    您所在的位置:读书频道 > 操作系统 > Linux > 1.2.7 poll接口 1.2.7 poll接口 2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) ...

  7. 异步通知《来自Linux驱动程序开发实例》

    您所在的位置:读书频道 > 操作系统 > Linux > 1.2.8 异步通知 1.2.8 异步通知 2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) 字号: ...

  8. 基于块的linux驱动程序,基于块的Linux驱动程序 块设备驱动 centos内核编译过程 操作系统课程设计...

    操作系统的课程设计,本人也是一头雾水地做完了课程设计,在这里贴下操作过程,放下当时参考的一篇CSDN文章链接:https://blog.csdn.net/cxy_chen/article/detail ...

  9. 第一个linux驱动程序

    本章将进行实例的学习,第一个linux驱动程序:统计单词个数.本例子的目的不是讲解如何统计单词个数,而是该算法的实现技术:Linux驱动.Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文 ...

最新文章

  1. 在Linux环境下mysql的root密码忘记解决方法
  2. linux离线安装redmine_Feem:免流量跨平台文件传输工具,支持离线分享
  3. oracle解决存储嗅探,DBA警示录:存储故障的处理应当谨慎
  4. android opengl es 雾化效果实例
  5. 2017.3.14 不重复数字 思考记录
  6. 传统软件测试的互联网化改造
  7. 软件测试工程师—从零到月入过万你只需要看这篇就够了(基础篇)
  8. 【Linux 系统编程】vim 的安装配置及使用
  9. 天融信荣获《中国信息安全》2018年度“双推”活动两项荣誉
  10. mysql查看enum和set值_mysql中的enum和set类型_MySQL
  11. 蓝宝石rx470d原版bios_小白福利教程:关于显卡BIOS的一些信息的讲解
  12. Android 快速索引(城市列表和联系人)
  13. excel换行快捷键_超实用的16个Excel快捷键,一定要收藏!
  14. Flutter键盘弹出造成布局异常解决
  15. 软考刷题利器—软考云题库Web版
  16. Android8.0未知来源应用安装权限
  17. FlyMcu串口下载
  18. win10系统ipv6服务器地址,Win10关闭iPv6地址方法
  19. v-rep仿真之键盘控制机械臂末端移动
  20. linux 限速工具

热门文章

  1. 数据绑定控件之Repeater
  2. struts2框架从数据库批量取得数据集并在前台页面循环显示
  3. 计算几何-经典算法-凸包
  4. Mac 使用SSH远程登录
  5. 排列组合算法的实现代码
  6. 面试常考--socket常见错误
  7. 2.STM32中对Key_GPIO_Config()函数的理解(自定义)之轮询控制按键LED
  8. 目标代码文件、可执行文件和库
  9. bug修复录-qq浏览器中post请求时body为空
  10. 在linux系统下把多个终端合并在一个窗口