2021-04-11

1.Linux 设备驱动概述及开发环境构建
1.1.设备驱动的作用
设备驱动是与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射,最终使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件和数据

1.2.无操作系统的驱动
在单任务的系统中,虽然不存在操作系统,但是设备驱动是必须存在的。一般情况下,对每一种设备驱动都会定义为一个软件模块,包含.h文件和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现。

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

其他模块需要使用这个设备的时候,只需要包含设备驱动的头文件serial.h,然后调用其中的外部接口函数即可。如我们要从串口上发送字符串“Hello World”,使用函数SerialSend( " Hello World",11)即可。
由此可见,在没有操作系统的情况下,设备驱动的接口被直接提交给了应用软件工程师,应用软件没有跨越任何层次就直接访问了设备驱动的接口。设备驱动包含的接口函数也与硬件的功能直接吻合,没有任何附加功能。图1.1 所示为无操作系统情况下硬件、设备驱动与应用软件的关系。

1.3.有操作系统时的设备驱动
首先,无操作系统时设备驱动的硬件操作工作仍然是必不可少的,没有这一部分,设备驱动不可能与硬件打交道。
其次,我们还需要将设备驱动融入内核。为了实现这种融合,必须在所有的设备驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,独立于具体的设备。当系统中存在操作系统的时候,设备驱动变成了连接硬件和内核的桥梁。

1.4.Linux设备驱动

驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核。Linux 将存储器和外设分为3 个基础大类:
字符设备;
块设备;
网络设备。

字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。
字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备和块设备并没有明显的界限,如Flash 设备符合块设备的特点,但是我们仍然可以把它作为一个字符设备来访问。字符设备和块设备的驱动设计呈现出很大的差异,但是对于用户而言,他们都使用文件系统的操作接口open()、close()、read()、write()等函数进行访问。
在 Linux 系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。内核与网络设备的通信和内核与字符设备、块设备的通信方式完全不同。另外,TTY 驱动、I2C驱动、USB驱动、PCI驱动、LCD 驱动等本身大体可归纳入3 个基础大类,但是对于这些复杂的设备,Linux 系统还定义了独特的驱动体系结构

1.5.学习驱动的重点难点

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

编写Linux 设备驱动要求工程师具有良好的硬件基础,懂得SRAM、Flash、SDRAM、磁盘的读写方式,UART、I2C、USB等设备的接口,轮询、中断、DMA的原理,PCI总线的工作方式以及CPU的内存管理单元(MMU)等。
编写Linux 设备驱动要求工程师具有良好的C语言基础,能灵活地运用C语言的结构体、指针、函数指针及内存动态申请和释放等。
编写Linux 设备驱动要求工程师具有一定的Linux 内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要了解设备驱动与内核的接口,尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备。
编写Linux 设备驱动要求工程师具有良好的多任务并发控制和同步的基础,因为在设备驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值