第章 设备驱动.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第章 设备驱动

第八章 设备驱动 设备驱动 作为通用的操作系统,Linux必须支持各种硬件设备。 然而,每种硬件设备都有自己的特点,有自己独特的使用方法,也就是说每个设备都需要特定的管理与控制程序。由于这些程序直接与硬件交互,因而必须在内核中实现。 但是,要在内核中实现所有设备的控制与管理程序,必将造成以下问题: 1、内核变得十分庞大,而且包含很多无用的代码。 2、新设备的增加十分困难,必须修改内核。 因此,应该提供一种机制来解决上述问题。 设备驱动 为了能够支持各种类型的外部设备,同时又不使内核变得太大,Linux采用了如下方法: 1、为每种(类)外部设备定义一个专有的驱动程序(driver)。 2、把驱动程序从内核中独立出来,只在真正需要时才将其插入内核。 3、在内核和驱动程序之间定义统一的接口,允许用户开发自己的驱动程序。 设备驱动 设备驱动 设备驱动 要开发设备驱动程序,必须具备两方面的知识: 1、在Linux操作系统中,驱动程序是如何构成的,如何工作的,它与内核其余部分的关系,必须注意的问题等。 2、设备的硬件特性,包括计算机的总线、接口,以及设备本身的硬件构成,它与总线的关系和操作方法等。 本章只讨论第一部分。 8.1 设备驱动程序概念 设备驱动程序是内核的一部分。 驱动程序与内核其它部分的区别是: 驱动程序是与设备交互的模块; 驱动程序通常由第三方厂商开发; 一个驱动程序不与其它驱动程序交互(Windows的驱动程序可以分层叠加); 内核与驱动程序之间仅通过一个严格定义的接口交互; 驱动程序大多是可配置的,而且是可动态装入的(内核模块)。 8.1 设备驱动程序概念 设备驱动程序一般由下面几部分组成: 1、对驱动程序接口函数集的实现。对字符和块设备,要实现的接口函数集是file_operations;对于网络设备,要实现的接口函数定义在结构net_device中。 2、设备专有部分。设备驱动程序自己定义的数据结构和管理函数。 3、中断处理程序。处理设备产生的中断(上部)。 4、初始化函数。初始化函数向系统注册驱动程序自身,包括:注册自己对接口函数集的实现,申请IRQ号并注册中断处理程序,申请并注册I/O地址等。初始化函数还完成对设备硬件的检测与初始化工作。 8.1 设备驱动程序概念 内核在下面几种情况下调用设备驱动程序: 1、配置:内核在初始化时,调用驱动程序检查并初始化设备,完成设备的配置; 2、I/O:内核调用设备驱动程序从设备读数据或向设备写数据; 3、控制:向设备发出控制命令,让设备完成读写以外的动作,如修改设备配置等; 4、中断:当设备完成了I/O操作、接收到外部数据、状态改变时,它会通过中断通知CPU,内核使用驱动程序中的中断处理程序完成相应的中断处理。 8.1.1 I/O空间 每一个外设都有自己的一组寄存器(如CSR),驱动程序通过这组寄存器来控制和使用设备。 为了访问设备的寄存器,必须给每个寄存器一个地址(I/O端口)。所有设备的寄存器地址构成了系统的I/O地址空间。 I/O地址空间是有限的。在Intel处理器中,I/O地址空间只有64KB(0-0xFFFF)。 每个设备使用的I/O地址是不同的,应该动态申请和分配I/O地址空间。 为了管理的方便,Linux用结构resource_entry_t描述设备的I/O地址空间。 8.1.1 I/O空间 typedef struct resource_entry_t { u_long from, num; const char *name; struct resource_entry_t *next; } resource_entry_t; Linux预先创建了一个resource_entry_t的结构数组,其中预定义了系统需要的所有resource_entry_t结构: resource_entry_t iotable[IOTABLE_SIZE]; // 128 已经使用(分配出去)的resource_entry_t结构被串联成一个链表,iolist是表头。 8.1.1 I/O空间 函数request_region()用来注册(申请)一个设备的I/O地址空间。即在数组iotable[]中填写一个resource_entry_t结构,并按起始地址from的顺序将其加入到iolist链表中。 函数release_region()用于释放设备的I/O地址空间。 在Intel系列处理器中,I/O空间与内存空间是相互独立的,Intel处理器提供了专门的指令(in和out)来访问I/O空间。 8.1.1 I/O空间 8.1.2 轮询和中断 内核通过轮询了解外设的状态(就绪与否、完成与否)。 外设通过中断向内核报告自己的情况,并请求系统服务。 如果设备采

您可能关注的文档

文档评论(0)

docman126 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档