最简Linux驱动

必备的头文件

• Linux头文件位置
– 类似#include <linux/module.h>的头文件,它们是在Linux源码目录下的include/linux/module.h
• #include <linux/module.h>头文件
– 所有的Linux 代码必须遵循GPL 协议,如果不知道Linux 的GPL 协议,去查一下资料
– 如果你不声明GPL 协议,你的模块将无法在Linux 中使用的
– MODULE_LICENSE(_license)添加遵循GPL协议,必须的!
– MODULE_AUTHOR(_author)代码作者

• #include <linux/init.h>
– 包含初始化宏定义的头文件,代码中的函数module_init和module_exit在此文件中
– 入口函数module_init(x)
– 出口函数module_exit(x)
• 新建.c文件
– mini_linux_module.c

模块的入口和出口

• module_init(hello_init);
– /*初始化函数*/
• module_exit(hello_exit);
– /*卸载函数*/

声明区

• 声明区
– MODULE_LICENSE("Dual BSD/GPL");
– /*声明是开源的,没有内核版本限制*/
– 必须有
– MODULE_AUTHOR("TOPEET");
– /*声明作者*/
– 可有可无

驱动模块的编译

• Linux的驱动可以和Linux源码放在一起编译,也可以单独拿出来编译。
– 为了理解整个Linux内核编译过程,可以从学习Linux模块的编译入手
• Makefile文件
– 单独编译驱动需要写一个Makefile文件
• 编写Makefile文件的最好方式是“依葫芦画瓢”
– 以后可能会碰到各种脚本,脚本的语法是学不完的

编译流程分析

编译文件

• 拷贝两个文件到虚拟机,执行Make命令,编译生成KO文件
– 在window下写的Makefile文件拷贝到Linux中可能会有点小问题需要修改
– 主要是Tab问题
– all和clean参数后面的必须添加Tab键,否则会报错“*** missing separator.Stop”
• 编译会生成KO文件,KO就是驱动模块

加载模块和卸载模块

• 开发板运行最小Linux系统
• 使用U盘(或者TF卡),将KO文件拷贝到Linux最小系统
– 最小系统给大家提供,直接烧写即可
• 加载U盘
– 参考使用手册
• 加载模块、查看模块、卸载模块
– insmod加载模块命令
– lsmod查看模块命令
– rmmod卸载模块命令

#include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("TOPEET"); static int hello_init(void)
{
printk(KERN_EMERG "HELLO WORLD enter!\n");
return ;
} static void hello_exit(void)
{
printk(KERN_EMERG "HELLO WORLD exit!\n"); } module_init(hello_init);
module_exit(hello_exit);

makefile

#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
obj-m += mini_linux_module.o #源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/topeet/android4./iTop4412_Kernel_3. #当前目录变量
PWD ?= $(shell pwd) #make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4./iTop4412_Kernel_3.
#$(PWD)当前目录变量
#modules要执行的操作
all:
make -C $(KDIR) M=$(PWD) modules #make clean执行的操作是删除后缀为o的文件
clean:
rm -rf *.o *.order Module.symvers *.mod.c

最新文章

  1. Servlet 单例多线程
  2. iOS实现简书的账号识别方式(正则表达式)
  3. [moka同学笔记]window下redis的安装以及php-redis详细配置(摘录)
  4. 修改MyEclipse默认的Servlet和jsp代码模板
  5. 游戏开发设计模式之命令模式(unity3d 示例实现)
  6. Js监控回车事件
  7. jqGrid一些操作
  8. 第二章 IoC Setter注入
  9. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
  10. installshield学习笔记
  11. 为已有表快速创建自动分区和Long类型like 的方法-Oracle 11G
  12. Struts2中的JSON问题——后台返回JSON字符串到前台
  13. css设置兼容的透明样式
  14. Windows中通过命令行新建文件夹、新建文件,和一些常用命令
  15. learning gcc args
  16. python中的update
  17. 将秒数转为HH:MM:SS格式的时间
  18. 谈谈Java引用和Threadlocal的那些事
  19. iOS开发-消息通知机制(NSNotification和NSNotificationCenter)
  20. JAVA-SpringMVC开发第一个应用

热门文章

  1. 今天刚到货的小米平板2,就出现dnx fastboot mode一直卡死黑屏
  2. Python笔记(十七)_面向对象编程
  3. 理解jquery的$.extend()、$.fn.extend()【jQuery插件机制】
  4. PTA 1154 Vertex Coloring
  5. debian7下安装eclipse
  6. hibernate validator参数校验&amp;自定义校验注解
  7. 数据溢出-varchar类型
  8. seaborn教程1——风格选择
  9. IEnumerable和IEnumerator 详解 分类: C# 2014-12-05 11:47 18人阅读 评论(0) 收藏
  10. 【学习总结】Eclipse常用快捷键