《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动
本节书摘来自异步社区《Android深度探索(卷1):HAL与驱动开发》一书中的第1章,第1.6节 Linux设备驱动,作者李宁,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.6 Linux设备驱动
Android深度探索(卷1):HAL与驱动开发
随着计算机技术的不断发展,与计算机(也包括手机等计算设备)相关的硬件设备的种类也不断丰富起来。这就需要大量的Linux设备驱动来与这些硬件设备进行交互。为了使读者在学习如何编写Linux驱动之前对Linux驱动有一个初步的认识,本节介绍了设备驱动在整个操作系统中的作用以及设备驱动的分类。
1.6.1 设备驱动的发展和作用
任何一台计算机系统的运行都是由软硬件共同作用的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则是一堆废铁。在计算机软件发展的初期,并没有驱动的概念,在这个时期的软件都是直接访问计算机的硬件。一般会通过计算机上的各种元器件和接口(如网卡上的中断、I/O端口、串口、寄存器等)与要控制的硬件通信。例如,本书曾经使用TC2.0(DOS环境)直接和串口通信来获取外部设备中的数据。
应用程序与硬件直接通信从技术上当然没什么问题,但却未对应用软件程序员的职责做更细的划分,所造成的后果就是应用软件程序员也必须要了解外部设备与计算机之间的通信协议以及一些硬件的知识才能使应用程序与这些设备通信,例如,控制打印机。问题还不止这些,大家试想,现在有一个应用程序要将生成的电子表格输出到打印机。应用程序最开始是为A型号打印机做的,而此时A型号打印机恰好坏了,换了B型号的打印机。由于A型号打印机和B型号打印机的打印指令差别很大,这就造成原来的应用程序无法控制B型号的打印机,为了使应用程序可以正常使用B型号打印机,必须重新修改应用程序的源代码以适应B型号打印机的打印指令。通过这个案例很容易知道如果应用程序直接访问硬件,就会造成与硬件耦合度过高的情况。
为了解决上述问题,软件不得不向前发展(几乎所有的新技术和新理论都是为了应对曾经无法解决的问题或使问题解决得更好而出现的,也就是说,由需求决定出现哪些新的技术和理论)。降低软件和硬件之间的耦合度成为当前首要解决的问题。了解面向对象的读者会很容易想到,降低对象与对象之间耦合度最有效的方法是通过接口(Interface)对类进行抽象,也就是说,抽象度越高,耦合度越低。
抽象这个概念同样也可以用在硬件上。只要将同一类型(如打印机)但不同型号的设备抽象成统一的接口就可以很容易解决上述问题。毫无悬念,这个抽象硬件的任务就落在了“驱动”身上。
驱动是直接和硬件交互的一类程序,负责对硬件进行抽象。如前面提到的打印机的例子。如果设计一套抽象的打印机驱动,并提供应用程序可访问的API。那么就算换了其他型号的打印机,只要应用程序通过驱动来访问打印机,就不需要再修改应用程序的源代码。而且开发应用程序的程序员并不需要了解打印机的打印指令。在解决上述接口问题的同时,又产生了一个新的技术领域:驱动程序开发。当然,开发驱动程序的技术人员通常被称为驱动工程师。
1.6.2 设备的分类及特点
计算机系统的硬件主要由CPU、存储器和外设组成。随着技术的不断提高,芯片的集成度也越来越高,往往在CPU内部就集成了存储器和外设适配器。ARM、PowerPC、MIPS等处理器都集成了UART、USB控制器、SDRAM控制器等,有的处理器还集成了片内RAM和Flash。
驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核。Linux将存储器和外设分为3大类:
字符设备(Character devices);
块设备(Block devices);
网络设备(Network devices)。
字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标、键盘等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备与块设备并没有明显的界限,如Flash设备符合块设备的特点,但是也可以把它作为一个字符设备来访问。
字符设备和块设备的驱动设计有很大的差异,但对用户而言,它们都使用文件系统(Linux通过文件系统访问驱动)的操作接口open、close、read、write等函数进行访问。
在Linux系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。Linux内核与网络设备的通信和Linux核与字符设备、块设备的通信方式完全不同。
另外,USB驱动、PCI驱动、LCD驱动等大体可归入上述3类设备,但对于这些复杂的设备,Linux系统还定义了独特的体系结构。
《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动相关推荐
- Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记
Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记 本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...
- Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术
Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术 对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点,逐步跟踪代码. ...
- Android深度探索(卷1)HAL与驱动开发学习笔记(8)
Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动 L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...
- Android深度探索(卷1)HAL与驱动开发第六章总结
操作系统是通过各种驱动程序赖家与硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式.设备驱动程序是操作系统最基本的组成部分之一,在Linux内核源程序中也 ...
- Android深度探索(卷1)HAL与驱动开发--读书笔记(第一章)
Android系统架构是由四层构成,第一层为Linux内核,主要包括Linux驱动程序以及内存管理.进程管理.电源管理的等程序.并且不同的Android的版本的驱动可能并不通用.第二层为C/C++代码 ...
- Android深度探索(卷1)HAL与驱动开发读后感---第四章
第4章 源代码的下载和编译 4.1 下载.编译和测试Android源代码 主要学习了:配置源代码的下载环境,Android源代码目录结构解析,下载Android源代码中的一部分,编译And ...
- Android深度探索(卷1)HAL与驱动开发第五章总结
开发板是开发和学习嵌入式技术的主要硬件设备,开发板的型号和种类很多,目前流行的是基于S3C6410 ARM11架构的开发板,S3C6410是由三星公司推出的一款低功耗,高性价比的RISC处理器,它基于 ...
- ANDROID深度探索(卷1)HAL与驱动开发 第四章
配置android源代码下载环境 (1)创建一个用于存放下载脚本文件(repo)的目录(可将该脚本文件一放到任何目录中,在这里使用~/bin).#mkdir ~/bin #PATH=~/bin: ...
- linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...
linux设备驱动归纳总结(一):内核的相关基础概念 1. 内核与 linux 设备驱动的作用与关系 内核:用于管理软硬件资源,并提供运行环境.如分配 4G 虚拟空间等. linux 设备驱动:是连接 ...
最新文章
- 反射学习笔记之动态创建对象和调用方法
- linux线程一直在增加,在.net core中遇到的奇怪问题:内存与线程数一直增长
- ASP.NET开发要抛弃ASP旧习和破烂
- 用python画钢铁侠_用自动铅笔素描画钢铁侠盔甲
- HTTP-post请求重定向后变成了GET请求
- 疯子的算法总结(三) STL Ⅱ迭代器(iterator) + 容器
- RocketMQ的组织架构和基本概念,Dledger高可用集群架构原理
- java 字符串每隔两位插入一个字符
- java批量上传文件_Spring Boot2(十四):单文件上传/下载,文件批量上传
- 自己制作一个计时器、倒计时器
- 什么是模式、什么是模式识别、模式识别的方法、过程
- Git amend 修改上次提交
- wordpress 背景_如何在WordPress中添加全屏背景图片
- C语言 猴子吃桃的问题 猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个。 第二天早上将剩下的桃子吃一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时只剩下一个桃子
- 计算机一级b类考试题软件,全国计算机等级考试一级b类windows模拟考题(二)
- 2018上半年最有价值科技类的微信公众号有哪些?
- TTL、CMOS、LVTTL、LVCMOS、LVDS
- uoni扫地机器人好用吗_由利Uoni扫地机器人V980 MAX好用吗?详细测评告诉你
- 深度学习之卷积神经网络经典网络LeNet-5简介
- 这家刷脸入住的酒店,满屋都是黑科技