linux设备驱动(一)

---恢复内容开始---

linux设备驱动

一,设备驱动的作用

  对设备驱动最通俗的解释是“驱动硬件设备行动”。驱动和底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询(轮询(Polling)是一种CPU决策如何提供周边设备服务的方式,又称“程控输出入”(Programmed I/O)。轮询法的概念是,由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始),中断处理,DMA通信,进行物理内存向虚拟的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。

  由此可见,设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统软件的应用编程接口(API)就可以让硬件去完成要求的工作。

  设备驱动可分为无操作系统的设备驱动和有操作系统的设备驱动。

  1,无操作系统的设备驱动

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

单任务软件典型架构

int main(int argc,char* avgv[])
{
  while(1)
    {
        if(serialInt==1)
       // 有串口中断
      {
        ProcessSerialInt();//处理串口中断
        serialInt=0;//中断标志变量清0
     }
    if(keyInt==1)
     //有按键中断
    {
      ProcessKeyInt();//处理按键中断
      keyInt=0;//中断标志标量清0
    }
     status=CheckXXX();
    switch(status)
    {
       . . .
     }
      . . .
     }
}    

2,有操作系统时的设备驱动

  当系统中包含操作系统后,设备驱动会变得怎样?

  首先,无操作系统是设备驱动的硬件操作工作仍然是必不可少的,没有这部分,驱动不可能与硬件打交道。

  其次,我们还需要将驱动融入内核。为了实现这种融合,必须在所有设备的驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定的,对一类设备而言结构一致,独立于具体的设备。。

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

  那我们要问,有了操作系统之后,驱动反而变得复杂,那么操作系统干什么?

  首先,一个复杂的软件系统需要处理多个并发的任务,没有操作系统,想完成多任务并发是很困难的。

  其次,操作系统给我们提供内存管理机制。一个典型的例子是,对于多数含MMU的处理器而言,windows,linux等操作系统可以让每个进程都可以独立的访问4G的内存空间。

  简而言之,操作系统通过给驱动制作麻烦来达到给上层应用提供便利的目的。当驱动都按照操作系统给出的独立于设备的接口而设计,那么,应用程序将可使用统一的系统调用接口来访问各种设备。

  作为linux爱好者,欢迎各位相互交流。

时间: 2024-11-05 12:29:39

linux设备驱动(一)的相关文章

linux设备驱动第五篇:驱动中的并发与竟态

综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争. 首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions).可能导致并发和竟态的情况有: SMP(Symmetric Multi-Processing),对称多处理结构.SMP是一种紧耦合.共享存储的系统模型,它的特点是多个CPU使用共

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的

Linux设备驱动开发 - 平台设备驱动

Linux2.6的内核中引入了一种新的设备驱动模型-平台(platform)设备驱动,平台设备驱动分为平台设备(platform_device)和平台驱动(platform_driver),平台设备的引入使得Linux设备驱动更加便于移植. 一.平台设备平台设备结构体: 1 struct platform_device { 2 const char * name; /* 设备名 */ 3 int id; 4 struct device dev; /* 设备结构体 */ 5 u32 num_res

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie

Linux设备驱动开发学习(1):前言

虽然网络上已经有很多Linux设备驱动开发学习的文章和博客,更是有很多经典的Linux设备驱动开 发的书籍,写这些博文似乎意义不大,但把自己的学习过程.学习心得记录下来,一方面有着强化巩固的 意义,另一方面也是把所学知识转化为自己所得的必要途径之一,这是我写这些的博客的原始动力.

linux设备驱动中的并发控制

并发指的是多个执行单元同时.并行被执行,而并发的执行单元对共享资源的访问则很容易导致竞态 linux内核中主要竞态1.多对称处理器的多个CPU  2.单CPU内进程与抢占它的进程 3.中断(硬中断.软中断.Tasklet.下半部)与进程之间访问共享内存资源的代码区称为“临界区”,临界区需要被以某种互斥机制加以保护,中断屏蔽.原子操作.自旋锁和信号量等是linux设备驱动中可采用的互斥途径. 这几个互斥的介绍: 1.中断屏蔽,这个主要用于单CPU,中断屏蔽将使得中断和进程之间的并发不再发生.使用方

深入浅出~Linux设备驱动中的阻塞和非阻塞I/O

今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合起来写的,,总之这又给了额外的动力,让自己继续前进,,希望和大家能够分享一些自己的经验,,在最需要奋斗的年级以及在技术的领域踽踽独行的过程中有共同的伙伴继续前进~ 今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的

linux设备驱动系列:如何处理竞态关系

综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争. 首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions).可能导致并发和竟态的情况有: SMP(Symmetric Multi-Processing),对称多处理结构.SMP是一种紧耦合.共享存储的系统模型,它的特点是多个CPU使用共

20150220 IMX257 linux设备驱动之Cdev结构

20150220 IMX257 linux设备驱动之Cdev结构 2015-02-20 21:17 李海沿 一.CDEV结构 /*   *内核源码位置   *linux2.6.38/include/linux/cdev.h   */        struct cdev {       struct kobject kobj;       struct module *owner;   //一般初始化为:THIS_MODULE       const struct file_operations

Linux设备驱动故障定位指引与实例

Linux设备驱动故障定位指引 Linux设备驱动种类繁多,涉及的知识点多,想写一个通用的故障定位方法指引,是个难度颇大且不容易做好的工作.限于笔者的经验,难以避免存在疏漏之处,欢迎大家留言指正补充. Linux设备驱动的知识点涉及硬件和软件,故障原因也各种各样,不过从笔者多年的维护经验来看,硬件相关问题导致的设备驱动故障还是占了较大的比例,而大部分的硬件问题特别是环境问题也是相对来说较容易排查的.下图是Linux设备驱动故障定位脑图(大图),图中按硬件和软件分为两类,硬件分类又细分为环境.芯片