linux设备驱动学习-1

本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识。

一、设备驱动的作用

  对设备驱动最通俗的解释就是“驱使硬件设备行动” 。设备驱动与底层硬件直接打交道, 按照硬件设备的具体工作方式读写设备寄存器, 完成设备的轮询、 中断处理、DMA 通信,进行物理内存向虚拟内存的映射,最终使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件和数据。此可见,设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。在系统中没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口,自己为函数命名。而在有操作系统的情况下,设备驱动的架构则由相应的操作系统定义,驱动工程师必须按照相应的架构设计设备驱动,这样,设备驱动才能良好地整合到操作系统的内核中。

二、无操作系统的设备驱动

  并不是任何一个计算机系统都一定要运行操作系统,在许多情况下操作系统是不必要的。对于功能比较单一、控制并不复杂的系统并不需要多任务调度、 文件系统、 内存管理等复杂功能,用单任务架构完全可以很好地支持它们的工作。 一个无限循环中夹杂对设备中断的检测或者对设备的轮询是这种系统中软件的典型架构。如图:

  在这样的系统中,虽然不存在操作系统,但是设备驱动是必须存在的。一般情况下,对每一种设备驱动都会定义为一个软件模块,包含.h 文件和.c 文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现。其他模块需要使用这个设备的时候,只需要包含设备驱动的头文件 serial.h ,然后调用其中的外部接口函数即可。

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

三、有操作系统的设备驱动

  操作系统的存在势必要求设备驱动附加更多的代码和功能,把单一的“驱使硬件设备行动”变成了操作系统内与硬件交互的模块,它对外呈现为操作系统的API,不再给应用软件工程师直接提供接口。

  首先,一个复杂的软件系统需要处理多个并发的任务,没有操作系统,想完成多任务并发是很困难的。其次,操作系统给我们提供内存管理机制。一个典型的例子是,对于多数含 MMU的处理器而言,Windows、Linux 等操作系统可以让每个进程都独立地访问 4GB 的内存空间。操作系统通过给设备驱动制造麻烦来达到给上层应用提供便利的目的。如果设备驱动都按照操作系统给出的独立于设备的接口而设计,应用程序将可使用统一的系统调用接口来访问各种设备。对于Linux 等操作系统而言, 应用程序通过 write()、read()等函数读写文件就可以访问各种字符设备和块设备,而不用管设备的具体类型和工作方式,

四、linux设备驱动

4.1设备的分类及特点

  计算机系统的硬件主要由 CPU 、存储器和外设组成。目前,芯片的集成度越来越高, 往往在 CPU 内部就集成了存储器和外设适配器。 ARM、 PowerPC、MI PS 等处理器都集成了 UART、I2C 控制器、USB 控制器、SDRAM 控制器等,有的处理器还集成了片内 RAM 和 Fl ash 。驱动针对的对象是存储器和外设(包括 CPU 内部集成的存储器和外设) ,而不是针对 CPU 核。Linux 将存储器和外设分为 3 个基础大类:

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

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

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

  除网络设备外,字符设备与块设备都被映射到 Linux 文件系统的文件和目录,通过文件系统的系统调用接口 open()、write()、read()、close()等函数即可访问字符设备和块设备。所有的字符设备和块设备都被统一地呈现给用户。块设备比字符设备复杂,在它上面会首先建立一个磁盘/Flash 文件系统, 如 F AT、 Ext3、 Y AFFS、JFFS 等。F AT、Ext3、Y AFFS、JFFS 规范了文件和目录在存储介质上的组织。

  应用程序可以使用 Linux 的系统调用接口编程,也可以使用 C 库函数,出于代码可移植性的考虑,后者更值得推荐。C 库函数本身也通过系统调用接口而实现,如 C库函数中的 fopen()、 fwrite()、 fread()、 fclose()分别会调用操作系统 API 的 open()、 write()、read()、close()函数。

4.3编写 Linux 设备驱动的技术基础

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

linux设备驱动概述,王明学learn的更多相关文章

  1. usb设备驱动描述,王明学learn

    usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...

  2. linux 设备驱动概述

    linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和 ...

  3. linux内核的组成,王明学learn

    linux内核的组成 一.linux内核源代码目录结构 arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386.ARM.PowerPC.MIPS 等. block:块设备 ...

  4. 《Linux设备驱动开发具体解释(第3版)》进展同步更新

    本博实时更新<Linux设备驱动开发具体解释(第3版)>的最新进展. 2015.2.26 差点儿完毕初稿. 本书已经rebase到开发中的Linux 4.0内核,案例多数基于多核CORTE ...

  5. linux设备驱动归纳总结(五):4.写个简单的LED驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-84693.html linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxx ...

  6. linux设备驱动归纳总结(五):1.在内核空间分配内存【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-79134.html linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxx ...

  7. linux设备驱动归纳总结(四):1.进程管理的相关概念【转】

    本文转载自;http://blog.chinaunix.net/uid-25014876-id-64866.html linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxx ...

  8. linux设备驱动归纳总结(三):7.异步通知fasync【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...

  9. linux设备驱动归纳总结(三):5.阻塞型IO实现【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-60025.html linux设备驱动归纳总结(三):5.阻塞型IO实现 xxxxxxxxxxxxxx ...

随机推荐

  1. ubuntu14.04 163sources.list

    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.163 ...

  2. C#之Windows消息处理

    public enum WindowsMessage:int { /// <summary> /// /// </summary> WM_NULL = 0x0000, /// ...

  3. ios 在中国地区,24小时时间格式 系统设定下 获得12小时制时间的方法

    如题,在中国地区,24小时时间格式 系统设定下,如果单单使用 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 之后,无论用hh ...

  4. C#集合及特殊字符

    集合里面 打印  出来时 要把 集合内的格式转化为其他格式! 壹. 集合 在.add之前 为空   数组  同样  添加元素之前 为  空(下一章超市购物例题具体体现) 1.System Collec ...

  5. SpringMVC java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name

    当跳转到一个含有form表单的页面的时候 如<form:form commandName="useCarInfo" 必须要new一个useCarInfo的同名实例给jsp来接 ...

  6. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  7. <context-param>与<init-param>

    <context-param>的作用: web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件w ...

  8. Hibernate双向一对多对象关系模型映射

    双向one-to-many 描述部门和岗位:一个部门有多个岗位 将单向的one-to-many 和many-to-one合并. 4.1双向的one-to-many数据库模型 create table ...

  9. asp.net 短信群发

    protected void Btn_Save_Click(object sender, EventArgs e) { string Contents = this.Txt_SmsContents.T ...

  10. [Android Pro] Android API 23中废弃了HttpClient的解决办法

    reference to : http://blog.csdn.net/hbwindy/article/details/51326019 reference to : http://blog.csdn ...