Linux驱动开发之 一 (有、无操作系统的差异)

Linux驱动开发之 一 (有、无操作系统的差异)


今天老谢想聊聊“驱动”,也就是driver。本文的目的非常简单,两点:

  1. 什么是驱动?
  2. 建立一个基本概念,基于操作系统的驱动开发是有别于无操作系统的驱动开发。

只有搞清这些基本的概念,我们才能明白什么是driver,driver在整个项目中扮演的角色……


一、驱动是什么?

驱动,即驱使硬件设备行动。例如最简单的例子,一个LED灯的亮或灭,就需要与之相对应的driver来驱使LED灯或亮或灭。

再看如下框图:

这里写图片描述

如上图所示,driver位于底层硬件之上,用于隔离上层应用层。


二、无操作系统的driver

首先我们需要明白,并不是所有的系统都一定运行操作系统。例如,电话机、微波炉、电冰箱等比较简单的系统不需要复杂的存储管理、文件系统、多任务调度等功能。一个无限循环中夹杂中断处理、轮询等功能就可以满足简单系统的应用。

在这样的系统中,虽然没有操作系统,但是驱动程序还是需要有的。一般情况,对应一种硬件设备,我们会定义一个软件模块,包括.h头文件和.c文件。在.h文件中定义该硬件设备的数据结构和声明外部函数;而.c文件则实现该设备的各个功能,即设备驱动的具体实现。

另外,在这种code架构中,driver驱动硬件,而driver中的API直接被AP层调用,中间并没有任何其他的中间层。说到这里,回过头来看,前文中的框图就是无操作系统的driver框图。

另外,比较容易出现的不规范的两种code架构:

  1. 没有AP应用层,即在driver层中直接开发AP应用层;
  2. 没有driver层,或者说将driver写在AP应用层。

三、基于操作系统的驱动开发

看看如下的框图,与前文中无操作系统的驱动开发相比,有以下特点:

这里写图片描述

  1. 与硬件沟通的driver程序还是必须要有,此时说的程序便是无操作系统的driver程序。
  2. 我们还需要将设备driver融入内核。正是为此,在设计driver时,还必须在设备driver中设计面向操作系统内核的接口,而这样的接口不是随便写的,是由操作系统已经规定好的。这也是基于操作系统的driver开发的难点所在。
  3. 由以上两点可见,设备driver的功能不再是无操作系统时连接AP和硬件的桥梁,反而变成了连接底层硬件和操作系统内核的纽带。而AP应用层则也不再直接调用设备驱动API了,而是调用操作系统向外提供的API接口。

四、说驱动一定不是说CPU

计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制造工艺的发展,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器。例如,集成了UART、I2C控制器、USB控制器、SDRAM控制器、RAM、Flash等。驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核。


五、Linux设备分类

Linux将存储器和外设分为3个基础大类:

  1. 字符设备
  2. 块设备
  3. 网络设备

这些设备在linux操作系统中的管理模式图如下:

这里写图片描述


特别鸣谢宋宝华老师对Linux设备驱动开发的分析详解。

itxiebo
20160425

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值