首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

不再害怕驱动!Linux字符设备驱动详解

不再害怕驱动!Linux字符设备驱动详解

现实世界中存在着大量的设备,操作系统要求能够控制和管理这些硬件,而驱动就能帮助实现管理控制。



下面我们从不同的角度理解一下驱动:


驱动(Device Driver)相当于硬件的接口,它维护着我们的硬件,操作系统通过驱动这个接口才能控制硬件。


驱动本身就是一段代码,自己不会主动运行,而是被操作系统调用执行。


驱动是内核的一部分,运行在内核空间。


驱动和应用程序有什么关系?


应用程序在运行中往往要用到硬件设备,但应用程序不能直接调用驱动程序,因此要执行系统调用陷入内核态才能调用驱动。


写驱动需要我们懂哪些知识?


1,需要熟悉Linux的内核机制
2,驱动程序与应用程序的接口
3,需要考虑系统对设备的并发操作
4,需要非常熟悉所开发硬件的工作原理

linux下的驱动千篇一律吗?


linux系统从各异的设备中提取共性特征,将其分为三大类:字符设备、块设备、网络设备。
字符设备驱动是这三类中最常见的,而且linux中又有很多基于字符驱动封装出来的驱动模型,例如:input设备、framebuffer设备、杂项设备等等,今后学习中我们会有所介绍
每一类设备驱动都有对应的驱动模型框架,降低了驱动编程的复杂度,大家都遵循固定的框架进行编程。


在学习linux驱动之前我们要先建立起相关概念,我们将从以下几点进行学习:


1.Linux驱动程序的功能

对硬件进行初始化和控制
检测和处理硬件出现的错误
负责从硬件读数据和传送数据给硬件设备
接收应用程序发送的数据和回送应用程序请求的数据


2.驱动程序与应用程序的区别


应用程序从头到尾执行完整的任务;驱动程序完成初始化之后不再运行,等待应用程序调用执行。
应用程序可以使用glibc等标准C函数库;驱动程序不能使用标准C库。
驱动程序是内核的一部分,工作在内核态;应用程序工作在用户态。


3.应用程序、库、内核、驱动程序的关系
应用程序调用函数库完成一系列功能,一部分库函数通过系统调用由内核完成相应功能,例如:printf、fread函数等等。
内核处理系统调用,内核在实现系统调用时会根据需要调用设备驱动程序操作硬件。
设备驱动是硬件设备的直接控制者,它完成了内核和硬件的通信任务。


4.设备驱动的种类
字符设备
I/O传输过程中以字符为单位进行传输;
用户对字符设备发出读/写请求时,实际的硬件读/写操作一般紧接着发生


块设备
块设备与字符相反,它的数据传输以块(内存缓冲)为单位传输;
用户对块设备读/写时,硬件读/写不会紧接着发生(即用户请求和硬件操作是异步的)
磁盘类、闪存类等设备都封装成块设备。


网络设备
网络设备是一类特殊的设备,它不像字符设备或块设备那样通过对应的设备文件访问,也不能直接通过read或write进行数据请求,而是通过socket接口函数进行访问。


5.设备文件和主/从设备号
设备文件是用户程序与设备驱动的一个接口,应用程序通过操作设备文件来调用设备驱动程序。
Linux把对硬件的操作全部抽象成对文件的操作,其中包含了控制和数据传输操作,例如:open,read,write,close...
Linux下的各种硬件设备以文件的形式存放于/dev目录下,可以使用ls/dev 命令进行查看
每个设备文件都有其文件属性(c或者b),表明其是字符设备还是块设备。


每个设备文件都有2个设备号,在/dev目录下使用“ll”或“ls-l”命令可以查看各个设备的设备类型、主/从设备号等详细信息。


主设备号:用于标识驱动程序,如果两个设备文件的主设备号相同,那他们使用同一个驱动程序。


从设备号:用于标识同一驱动程序的不同硬件,为了能把不同的具体硬件分开,又通过从设备号来区分使用相同驱动程序的不同设备。
例如:210开发板中的串口设备,主设备号标识串口这类设备,从设备号标识具体的某个串口。


用户通过“cat /proc/devices”命令可以查看当前系统中主设备号的使用情况,以及和硬件设备的对应情况。
返回列表