最简单的驱动HelloWorld

  • 1. 简述
  • 2. 代码分析
  • 3. 编译步骤

1. 简述

本文的目的是编写基于ARM的最简的驱动程序,也就是令该驱动输出Hello World。驱动(.c文件)相对比较简单,但是驱动需要经过编译才能在linux系统中运行。编译方式有两种,一种是将驱动文件编译到内核中,这也是绝大多数驱动编译的方法,一种是把驱动作为一个模块进行编译,不需要编译进内核,这样的方式适合对驱动程序的初期调试,调试完毕之后,还是要编译到内核中去的。模块化编译所需要的文件如下图所示:

最小驱动模块除了最小驱动文件的四个部分,还需要一个Makefile文件来对最小驱动模块进行编译,对于Makefile不建议详细的学习,只需知道怎么更改即可。

2. 代码分析

驱动的源文件,即.c文件,比较简单,如下段代码HelloWorld.c所示,每句话都有注释,很容易理解。

/*
Name:Hello World
Author:Ethan
Version:1.0
Date:2019-11-26
*/
/*包含初始化宏定义的头文件,代码中的module_init和module_exit再次文件中)*/
#include<linux/init.h>
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/
#include<linux/module.h>/*声明是开源的,没有内核版本限制*/
MODULE_LICENSE("Dual BSD/GPL");
/*声明作者*/
MODULE_AUTHOR("Ethan");//编写初始化函数
static int hello_init()
{/*加载驱动时打印hello world*/printk(KERN_EMERG "Hello World!\n");return 0;
}//编写卸载函数
static void hello_exit()
{/*卸载驱动时打印see you*/printk(KERN_EMERG "See you!\n");
}/*初始化函数*/
module_init(hello_init);
/*卸载函数*/
module_exit(hello_exit);

Makefile文件如下所示,最常用更改的地方就是文件名和内核路径:

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

3. 编译步骤

① 将HelloWorld.c和Makefile文件移动到linux系统中的某一文件夹下(任意地方或者新建都可以)。
② 执行命令:

make

执行完毕之后可以在该文件夹下生成.ko文件,该文件就是编译生成的驱动。
③ 我们通过开发板来验证该驱动是否编写与编译成功:
—>将.ko文件拷贝到U盘中
—>用命令

mount /dev/sda1 /mnt/disk/

将U盘挂载。
—>可以用命令

ls /mnt/disk/

来列出已经编译成功的.ko文件
—>用加载命令,来加载我们编译好的驱动

insmod /mnt/disk/HelloWorld.ko

加载结果为:

Hello World!

—>用卸载命令,来卸载刚装好的helloworld驱动

rmmod HelloWorld

卸载结果为:

See you!

Linux驱动(7)--最简单的驱动HelloWorld相关推荐

  1. linux .pc文件make,简单的驱动makefile详解

    简单的驱动makefile详解 一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编 ...

  2. linux下spi flash驱动程序,关于spi flash芯片m25p80驱动以及其简单的mtd驱动分析

    项目中用到了spi flash芯片MX25L25635E,之前在uboot下简单分析了驱动代码,调试该flash擦除的bug,一直没有时间分 析内核中关于该芯片的驱动,以下是对该芯片驱动的一个简单分析 ...

  3. linux 字符设备驱动测试,一个简单字符型设备驱动及其测试

    驱动对一些人来说很难,而对一些人来说很容易.窃以为,理解简单设备驱动模型不难,深入理解并与Linux内核设计联系到一起需要花费时间.对于移植者来说,如何将自己自定义的模块天衣无缝放到内核中,是比较重要 ...

  4. 简单字符驱动笔记(朱有鹏)

    框架 static int __init chrdev init(void) {printk(KERN_DEBUG "chrdev_init");return 0; }static ...

  5. linux i2c核心,总线与设备驱动,Linux2.6.37 I2C驱动框架分析(一)

    最近工作中又使用到了I2C,所以借S3C2440开发板GT2440为硬件平台温习一遍I2C驱动体系. linux内核中IIC驱动的体系框架 linux内核中IIC部分驱动代码位于:/drivers/i ...

  6. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接

    MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接 <一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式 ...

  7. linux显卡驱动mxm,linux下我的FX5200显卡驱动安装

    linux下我的FX5200显卡驱动安装 发布时间:2008-09-20 16:42:33来源:红联作者:Keiboc 一.为什么要装驱动 一般情况下,只要你下载了LINUX的最新发行版本,比如Fed ...

  8. NanoPi NEO Air使用九:使用Linux内核自带的LED驱动

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  9. NanoPi NEO Air使用八:编写个简单的驱动和应用程序

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

最新文章

  1. Cocos2dx-demo演示项目:Part1
  2. python concat函数 多张表_教你用python递归函数求n的阶乘,优缺点及递归次数设置方式
  3. 成功解决Command quot;python setup.py egg_infoquot; failed with error code 1 in C:\Users\AppData\
  4. linux redis -p,linux 安装redis
  5. vs 创建控制器 一直收集信息_日产Pro-Pilot的ADAS控制器拆解
  6. 追踪源码自定义负载均衡策略
  7. android ifw 启动广告,使用 IFW 完全控制 Android 应用行为 | 实用技巧
  8. [vue] vue组件之间的通信都有哪些?
  9. paddlepaddle测试安装_百度paddlepaddle深度学习7日入门-CV疫情特辑心得
  10. 创建线程时,需要创建的内容
  11. java借口案例实现_java实现接口的典型案例
  12. 逐行读取txt文件中_Spring系列八:Spring 中读取文件-ResourceLoaderAware
  13. win7中jar包不能安装的问题
  14. 基于密集卷积神经网络的多类植物病害检测与分类
  15. Spark常用算子讲解二
  16. (1.6w字)浏览器灵魂之问,请问你能接得住几个?
  17. css文本缩进两个字符,css如何设置首行缩进2个字符
  18. Python 实现Jaccard相似度计算,判断英文新闻标题相似度
  19. 手把手教你写Ov7725摄像头数据采集模块(带Verilog代码)
  20. Visual C++编译错误:error C2220: 警告被视为错误 - 没有生成“object”文件

热门文章

  1. java 后台自动刷新请求_spring oauth2+JWT后端自动刷新access_token
  2. html5 制作商品显示介绍,HTML5+CSS3:3D展示商品信息示例
  3. MySQL运算符ppt_mysql运算符
  4. java固定数组_Java在固定长度的数组里加入一个数
  5. 什么是页损坏 mysql_MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题...
  6. C#调用Server_SQL
  7. struct数组初始化
  8. 在Oracle中添加用户登录名称
  9. discuz 表结构
  10. 【XMPP】XMPP协议之原理篇