Linux设备驱动编写入门

姓名:顿皓 学号:19020100178 学院:丁香2号书院

转自:linux设备驱动编写入门 - 浇筑菜鸟 - 博客园 (cnblogs.com)

【嵌牛导读】Linux设备驱动是什么?我个人的理解是Linux有用户态和内核态,用户空间中是不能直接对设备的外设进行使用而内核态中却可以,这时我们需要在内核空间中将需要的外设驱动起来供用户空间使用。Linux的驱动主要分为字符设备、块设备、和网络设备三类,在分别驱动时需要注意一下,其中驱动不一定单属于哪一类,一个驱动可能属于多种分类。

【嵌牛鼻子】Linux   驱动编写

【嵌牛提问】如何编写Linux设备驱动?

【嵌牛正文】

一、准备材料

可以根据自己的需要准备相应材料:

开发环境:VMware

操作系统:ubuntu

开发板:湃兔i2S-6UB

二、下载linux内核源码

1.ubuntu内核源码的下载方式,直接通过命令下载即可,下载后源码存放的地址在/usr/src路径下

sudo apt-getinstalllinux-source

经过的测试好像ubuntu不需要下载源码也是可以编写驱动的,具体教程见后面内容。

2.湃兔核的内核源码下载地址:http://i2som-zh.oss-cn-beijing.aliyuncs.com/i2SOM-iMX-Linux-706035a.tar.gz

下载完成后解压到开发环境的路径下,具体路径根据个人爱好。

三、编写驱动

1.入口函数和出口函数

学习编程语言时,代码都会有开始运行的位置,也就是我们所知的入口函数'mian()',同样的原理linux驱动编写也是有入口函数的,只是linux驱动比较特殊,函数基本都是成对存在的,有入口便有出口,所以linux存在入口函数和出口函数,如下所示

module_init(x)//入口函数

module_exit(x)//出口函数

留意过内核源码的小伙伴都知道,入口和出口函数的定义是在liunx内核源码中的include/linux/init.h文件中,如下图所示:

2.打印函数

linux的驱动中打印日志到控制台的函数和用户空间的打印函数函数名不一样,但是功能和使用方法差不多,linux内核的打印函数是printk()

打印函数的定义是在liunx内核源码中的include/linux/printk.h文件中,如下图所示:

3.编写hello.文件

创建一个hello的驱动文件夹,然后创建hello.c文件,文件内容如下

#include<linux/module.h>

#include<linux/kernel.h>

#include<linux/init.h>

static int __init hello_init(void){

    printk("hello_init\r\n");

    return 0;   

}static void __exit hello_exit(void){

    printk("hello_exit\r\n");

}/*

*模块入口与出口函数

*/

module_init(hello_init);

module_exit(hello_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("jiaozhu");

4.编写Makefile文件

编写完驱动程序后,需要创建Makefile文件,在这里需要注意x86和arm架构环境下的内容有所不同

x86架构下的Makefile内容如下所示

KERNELDIR := /lib/modules/5.8.0-59-generic/build

CURRENT_PATH := $(shell pwd)

obj-m := hello.o

build: kernel_modules

kernel_modules:

    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:

    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

注意:ubuntu的所需的内核源码路径在/lib/modules/5.8.0-59-generic/build

arm架构下的Makefile内容如下所示

KERNELDIR := /home/i2SOM-iMX-Linux

CURRENT_PATH := $(shell pwd)

obj-m := hello.o

build: kernel_modules

kernel_modules:

    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:

    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

注意:编写arm架构的驱动是需要设置交叉编译器,这里没在Makefile文件中设置交叉编译器的原因是我已经在源码的顶层路径Makefile文件中设置了。

5.编译

完成hello.c文件和Makefile文件的编写后,就可以进行编译了,使用make命令进行编译,编译完成完成后会生成.ko文件,如下图所示:

到此驱动的编写已经完成了,细心的小伙伴可能已经注意到我加载和卸载驱动时没有日志输出,具体原因我也不知道,在arm开发板中测试时是有日志输出的。

四、测试

编译完成后生成的hello.ko驱动模块可以通过insmodmodprobe命令加载模块。

1.ubuntu中使用modprobe命令加载模块时需要将.ko文件拷贝到/lib/modules/5.8.0-59-generic路径下,然后在进行加载

sudo cp hello.ko /lib/modules/5.8.0-59-generic -f

sudo depmod

sudo modprobe hello

注意:/lib/modules/5.8.0-59-generic具体的路路径可能不一样,可以进入/lib/modules/目录下查看。

2.arm开发板中使用modprobe命令加载模块时需要将.ko文件拷贝到/lib/modules/路径下,如果路径不存在直接创建相应的路径即可,arm一般测试方式都是通过nfs挂载根文件系统的形式进行测试。

在开发环境中将.ko文件拷贝至rootfs跟文件系统的/lib/modules路径下

sudocp hello.ko /home/rootfs/lib/modules/4.1.43-f

注意:文件4.1.43是开发板内核的文件版本,不问版本的内核对应的文件不同

然后启动开发板,执行加载命令

depmod

modprobe hello

3.查看加载的驱动和卸载驱动

在任意路径下使用lsmod命令即可查看驱动模块,如下图所示:

完成后可以通过rmmod hello卸载驱动模块,注意在ubuntu下可能需要通过root权限才能卸载。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容