Linux驱动开发之 一 (有、无操作系统的差异)
Linux驱动开发之 一 (有、无操作系统的差异)今天老谢想聊聊“驱动”,也就是driver。本文的目的非常简单,两点:什么是驱动?建立一个基本概念,基于操作系统的驱动开发是有别于无操作系统的驱动开发。只有搞清这些基本的概念,我们才能明白什么是driver,driver在整个项目中扮演的角色……一、驱动是什么?驱动,即驱使硬件设备行动。例如最简单的例子,一个LED灯的亮或灭,就需要与之相对应的
Linux驱动开发之 一 (有、无操作系统的差异)
今天老谢想聊聊“驱动”,也就是driver。本文的目的非常简单,两点:
- 什么是驱动?
- 建立一个基本概念,基于操作系统的驱动开发是有别于无操作系统的驱动开发。
只有搞清这些基本的概念,我们才能明白什么是driver,driver在整个项目中扮演的角色……
一、驱动是什么?
驱动,即驱使硬件设备行动。例如最简单的例子,一个LED灯的亮或灭,就需要与之相对应的driver来驱使LED灯或亮或灭。
再看如下框图:
如上图所示,driver位于底层硬件之上,用于隔离上层应用层。
二、无操作系统的driver
首先我们需要明白,并不是所有的系统都一定运行操作系统。例如,电话机、微波炉、电冰箱等比较简单的系统不需要复杂的存储管理、文件系统、多任务调度等功能。一个无限循环中夹杂中断处理、轮询等功能就可以满足简单系统的应用。
在这样的系统中,虽然没有操作系统,但是驱动程序还是需要有的。一般情况,对应一种硬件设备,我们会定义一个软件模块,包括.h头文件和.c文件。在.h文件中定义该硬件设备的数据结构和声明外部函数;而.c文件则实现该设备的各个功能,即设备驱动的具体实现。
另外,在这种code架构中,driver驱动硬件,而driver中的API直接被AP层调用,中间并没有任何其他的中间层。说到这里,回过头来看,前文中的框图就是无操作系统的driver框图。
另外,比较容易出现的不规范的两种code架构:
- 没有AP应用层,即在driver层中直接开发AP应用层;
- 没有driver层,或者说将driver写在AP应用层。
三、基于操作系统的驱动开发
看看如下的框图,与前文中无操作系统的驱动开发相比,有以下特点:
- 与硬件沟通的driver程序还是必须要有,此时说的程序便是无操作系统的driver程序。
- 我们还需要将设备driver融入内核。正是为此,在设计driver时,还必须在设备driver中设计面向操作系统内核的接口,而这样的接口不是随便写的,是由操作系统已经规定好的。这也是基于操作系统的driver开发的难点所在。
- 由以上两点可见,设备driver的功能不再是无操作系统时连接AP和硬件的桥梁,反而变成了连接底层硬件和操作系统内核的纽带。而AP应用层则也不再直接调用设备驱动API了,而是调用操作系统向外提供的API接口。
四、说驱动一定不是说CPU
计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制造工艺的发展,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器。例如,集成了UART、I2C控制器、USB控制器、SDRAM控制器、RAM、Flash等。驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核。
五、Linux设备分类
Linux将存储器和外设分为3个基础大类:
- 字符设备
- 块设备
- 网络设备
这些设备在linux操作系统中的管理模式图如下:
特别鸣谢宋宝华老师对Linux设备驱动开发的分析详解。
itxiebo
20160425
更多推荐
所有评论(0)