linux设备驱动开发详解 阅读笔记1(第一篇入门)

无操作系统的驱动

在单任务的系统中,虽然不存在操作系统,但是设备驱动是必须存在的。一般情况

下,对每一种设备驱动都会定义为一个软件模块,包含.h文件和.c文件,前者定义该

设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现。


图1.1 无操作系统时硬件、设备驱动和应用软件的关系

其他模块需要使用这个设备的时候,只需要包含设备驱动的头文件serial.h,然后调用其中的外部接口函数即可。如我们要从串口上发送字符串“Hello World”,使用函数SerialSend( " Hello World

",11)即可。

由此可见,在没有操作系统的情况下,设备驱动的接口被直接提交给了应用软件工程师,应用软件没有跨越任何层次就直接访问了设备驱动的接口。设备驱动包含的接口函数也与硬件的功能直接吻合,没有任何附加功能。图1.1 所示为无操作系统情况下硬件、设备驱动

与应用软件的关系。

有操作系统时的设备驱动

    首先,无操作系统时设备驱动的硬件操作工作仍然是必不可少的,没有这一部分,

设备驱动不可能与硬件打交道。

    其次,我们还需要将设备驱动融入内核。为了实现这种融合,必须在所有的设备驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,独立于具体的设备。

当系统中存在操作系统的时候,设备驱动变成了连接硬件和内核的桥梁。



Linux设备驱动

驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是

针对CPU核。Linux 将存储器和外设分为3 个基础大类:

l 字符设备;

l 块设备;

l 网络设备。

字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、

鼠标等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。

字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备和

块设备并没有明显的界限,如Flash 设备符合块设备的特点,但是我们仍然可以把它

作为一个字符设备来访问。

字符设备和块设备的驱动设计呈现出很大的差异,但是对于用户而言,他们都使

用文件系统的操作接口open()、close()、read()、write()等函数进行访问。

在 Linux 系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件

系统的节点。内核与网络设备的通信和内核与字符设备、块设备的通信方式完全不同。

另外,TTY 驱动、I2C驱动、USB驱动、PCI驱动、LCD 驱动等本身大体可归纳

入3 个基础大类,但是对于这些复杂的设备,Linux 系统还定义了独特的驱动体系结

构。


Linux设备驱动与整个软硬件系统的关系

学习驱动的重点难点

Linux 设备驱动的学习是一项浩大的工程,读者需要首先掌握以下基础。

l 编写Linux 设备驱动要求工程师具有良好的硬件基础,懂得SRAM、Flash、

SDRAM、磁盘的读写方式,UART、I2C、USB等设备的接口,轮询、中断、

DMA的原理,PCI总线的工作方式以及CPU的内存管理单元(MMU)等。

l 编写Linux 设备驱动要求工程师具有良好的C语言基础,能灵活地运用C语

言的结构体、指针、函数指针及内存动态申请和释放等。

l 编写Linux 设备驱动要求工程师具有一定的Linux 内核基础,虽然并不要求

工程师对内核各个部分有深入的研究,但至少要了解设备驱动与内核的接

口,尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备。

l 编写Linux 设备驱动要求工程师具有良好的多任务并发控制和同步的基础,

因为在设备驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同

步机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值