让我不再害怕驱动

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”命令可以查看当前系统中主设备号的使用情况,以及和硬件设备的对应情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值