Linux 驱动程序编写流程概述

编写 Linux 驱动程序的步骤


第1步:建立 Linux 驱动的骨架(加载和卸载 Linux驱动)

Linux 内核在使用驱动前需要先加载驱动。在加载过程中会进行一些初始化的工作,比如分配设置注册对应的结构体,创建设备文件,分配内存地址空间等。而当 Linux 内核需要移除这个驱动时,会卸载该驱动,在卸载这个驱动的过程中会释放掉加载时这个驱动占用的资源,比如释放分配的内存地址空间以及删除创建的设备文件。在 Linux 内核中通过 module_init()module_exit() 这两个宏来分别处理驱动加载和卸载的工作。

##第2步:注册和注销驱动的设备文件
任何一个驱动的加载都会创建其对应的设备文件,否则用户空间就无法与 Linux 内核的驱动程序进行交互。而创建并注册设备文件的工作就是在上述的**module_init()指定的入口函数中实现的,相应的,销毁创建的设备文件则有module_exit()**指定的出口函数完成。以注册和注销一个杂项字符设备为例:

/* 注册一个杂项字符设备 */
int misc_register(struct miscdevice * misc)

/* 注销一个杂项字符设备 */
*int misc_deregister(struct miscdevice *misc)

第3步:指定与驱动相关的信息

Linux 驱动通过一些宏来描述该驱动的相关信息,比如编写该驱动的作者的姓名、使用的开源协议、别名、驱动描述等信息,这些信息都是通过这些宏在驱动中描述的:

功能
MODULE_AUTHOR() 驱动作者姓名
MODULE_LICENSE() 使用的开源协议
MODULE_ALIAS() 驱动的别名
MODULE_DESCRIPTION() 驱动的描述信息

第4步:指定回调的函数

Linux 驱动包含多种操作,例如,用户空间向内核空间写入数据时会触发写操作,然后 Linux 内核就会调用对应驱动程序里的write回调函数;用户空间从内核空间读取数据时会触发读操作,然后
linux 内核就会调用对应驱动程序里的read回调函数。所有的这些回调函数都封装在file_operation这个文件操作结构体中,并通过相关的机制注册到 Linux 内核中才会生效。

第5步:编写业务逻辑代码

这部分时 Linux 驱动的核心部分。在这里我们实现了开篇所说的一些初始化的工作,如创建设备文件,分配设置注册对应的设备驱动,创建proc/sysfs文件系统节点,设置RESET,INT引脚以及申请中断等。

第6步:编写 Makefile 文件

当 Linux 驱动程序编写完成后,需要通过 Makefile文件来完成编译。因为在 Linux 内核源码的编译规则是通过 Makefile 来实现的,因此每一个新的 Linux 驱动程序都对应着一个相应的 Makefile 文件。

第7步:编译 Linux 驱动程序

Linux 驱动程序可以直接编译进内核,也可以作为一个单独的模块来编译。它可以通过menuconfig或者**.config**文件来进行设置。

第8步:安装和卸载 Linux 驱动

如果将 Linux 驱动编译进内核,那么在上电启动 Linux 内核的过程中,会自动加载 Linux 驱动程序。而如果驱动程序是以模块的形式单独存在,那么就需要使用insmod或者modprobe命令来加载相应的 Linux 驱动模块了;相反的如果要卸载这个 Linux 驱动模块可以通过rmmod命令来实现。

注:

上述的8个步骤中,前5个步骤主要描述了如何编写一个 Linux 驱动程序的流程,而后3步则是描述了编译以及加载的大概流程。

发布了23 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/karaskass/article/details/102260008