Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1661996
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: 嵌入式

2014-01-13 20:20:01

原文地址:U盘基本工作原理 作者:arthursky

执行硬件中断请求
IRQ(Interrupt Request)的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态。比如我们要打印一份文件,在打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印的操作。

  产生中断请求的设备或者事件被称为中断源,中断源可分为两类:一类是CPU内部中 断,即执行软件中断指令INT或遇到软件陷阱而产生的中断,它们的中断类型号已由CPU规定好;另一类中断是由CPU以外的I/O设备产生的中断,又称硬 件中断,硬件中断可分为不可屏蔽中断NMI和可屏蔽中断INTR,NMI用于紧急情况的故障处理,如RAM奇偶校验错等,INTR则用于外部依靠中断来工 作的硬件设备。网卡使用的就是INTR,下面我们对IRQ进行更深入的了解。

  一、中断类型号和IRQ

  外部设备的中断请求是通过中断控制器8259A的INT引脚输入到CPU的INTR引脚向CPU提出中断申请的,并送去一个中断类型号,这是一个8位的二进制数。

  一片8259A能负责整个外部设备的中断请求(1RQ0-IRQ7),每个外设对应一个中断请求号。

 
图为:中断类型号与中断请求号

  二、IRQ的优先级和默认配置

  一般计算机只能支持16个IRQ,也就是提供16个硬件设备的中断请求,16个IRQ是用两个8259A通过级联来实现的。

 
图为:主从8259A连接图

  主中断控制器8259A的IRQ2与从中断控制器8259A的INT引脚相连,因此 从8259A上的中断请求优先级(Priority)享受主8259AIRQ2上的优先分级。所谓优先级是指当有多个中断源提出中断请求时,CPU先为优 先权高的中断请求服务。再为优先权低的中断服务。主8259A中IRQ0~IRQ7中的IRQ0优先权最高,IRQ7最低;从8259A中以IRQ8最 高,IRQl5最低。

  由于两个8259A的连接关系,从8259A的IRQ8~IRQ15的优先权低于主8259A的IRQ0~IRQl,而高于主8259A的IRQ3~IRQ7。

 
图为:中断优先级顺序

  计算机中有些IRQ有默认的配置,这些默认的配置都是些常用设备,一般的默认配置。

 
图为:1RQ的默认配置使用情况

  现在的Windows操作系统已经运用PNP技术,这种“即插即用”的功能可以将中 断进行自动分配,大大简化了用户的操作。不过这种PNP技术也有它的弱点,那就是如果不能认出要安装的新设备,那么自动分配中断时就会产生冲突。我们日常 所用的硬件对于IRQ的设置也不尽相同,所以在安装新硬件的时候,系统往往并不能自动检测正确的IRQ来分配给所有调用的硬件,这就会造成此硬件设备或是 原来的旧硬件出现不能正常工作的现象。现在新的硬件产品层出不穷,各种产品又相互兼容,功能类似,这就导致了操作系统常常不能正确检测出新设备,中断冲突 也就不可避免了。其实这是因为系统自动将该硬件的IRQ分配给了其他与此IRQ相同的硬件上,从而发生冲突使硬件不能正常工作。一般如果遇到这种情况,只 要将新旧两个硬件的IRQ配置手动调开就可以解决了。手动配置IRQ时,最好检查有无保留中断(IRQ),不要让其他设备使用该中断号,以免引起新的中断 冲突,造成系统死机。另外从表2还可以看出,COM1端口设置为IRQ4,而COM2端口设置为IRQ3,即COM2比COMl中断优先权高,所以为保持 通信的传输质量通常将COM2端口接调制解调器,而把COM1留给鼠标使用。利用相同的原理,合理分配各硬件设备的中断号,将使你的系统性能佳。

在每个系统中会有两颗芯片来提供16个IRQ,其中大多的IRQ都有固定的编排,例如 IRQ 0固定为系统定时器,IRQ 1则是键盘。因为每一个IRQ只能让一种设备使用,所以IRQ数目十分有限,若计算机安装很多的配件,IRQ势必就会不敷使用,所以可能会发生两个设备共占同一个IRQ的现象,此时也就会出现IRQ冲突问题,造成该设备无法使用。
最简单的解决方法就是到操作系统的硬件中去手动调整IRQ的分配,或是在BIOS中作调整。如果是IRQ不敷使用的情形,可以利用其它的方式来解决此一窘境,像是PCI总线可以共享一个IRQ,所以基本上可以采增加PCI插卡的方式,就不会被IRQ 所限制。其次是使用USB传输来解决,因为USB控制芯片只会占用一个IRQ,并非所有的USB产品都要独占一个IRQ,所以理论上可以连结最多到127件周边产品,而且目前拥有USB传输界面的产品也越来越普遍了。所以对于传输速度要求不高的周边设备,未来大概将逐渐朝USB接口发展。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
windows处理硬件中断请求

键盘、打印机、磁盘等等设备的中断请求是由中断控制器(Interrupt Controller)统一控制的。中断控制器提供有限的中断请求(IRQ)数,如i8259A可编程中断控制器(Programmable Interrupt Controller, PIC)它提供了16个IRQ。我们可以通过!pic命令来查看详细的信息。

而i82489高级可编程中断控制器(Advanced Programmable Interrupt Controller,APIC)提供了256个IRQ。

虽然中断控制器本身提供了中断级别,但是Windows还是实现了它自己的中断优先级方案,称为中断请求级别(Interrupt Request Levels,IRQLs)。在不同的体系结构下,Windows内核所提供的IRQLs的数目是不同的,x86下提供0到31一共32个请求级别,而x64和IA64下则提供0到15一共16个级别。Windows的硬件抽象层(HAL)负责把硬件中断号映射到IRQLs上

每一个CUP都有一个IRQL值,它随着操作系统内核模式下代码的执行而改变。这个IRQL值决定了哪一些中断能被响应,哪一些中断不能被响应(那些IRQL值大于当前CPU的IRQL值的中断能被响应,那些IRQL值小于或等于当前CPU的IRQL值的中断不能被响应)。

当中断控制器的引线上收到中断信号,它将打断CPU;这时,CPU将向中断控制器询问IRQ号;中断控制器将IRQ号转换成中断号(Interrupt Number),使用这个中断号作为中断分发表(Interrupt DIspatch Table,IDT)的索引,从而可以找到对应的中断处理程序,并将CPU的控制权交给该中断处理程序。


IDT表是在系统初始化时生成的,其内容如下(根据硬件的实际情况会有所不同):


系统正是通过IDT找到对应的中断处理程序的。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

USB总线属于一种轮询式总线,主机控制端口初始化所有的数据传输。每一总线动作最多传送三个数据包,包括令牌(Token)、数据(Data)、联络(HandShake)。
按照传输前制定好的原则,在每次传送开始时,主机送一个描述传输动作的种类、方向、USB设备地址和终端号的USB数据包,这个数据包通常被称为令牌包(TokenPacket)。USB设备从解码后的数据包的适当位置取出属于自己的数据。数据传输方向不是从到设备就是从设备到主机。
在传输开始时,由标志包来标志数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有。接收端也要相应发送一个握手的数据包表明是否传送成功。发送端和接收端之间的USB数据传输,在和设备的端口之间,可视为一个通道。USB中有一个特殊的通道一缺省控制通道,它属于消息通道,设备一启动即存在,从而为设备的设置、状态查询和输入控制信息提供一个入口。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
描述符

      USB采用USB标准描述符说明一个USB设备,这些描述符包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。对于高速设备还包括设备限定描述符和其他速率配置描述符。设备类和供应商也可以自己定义其设备专用描述符,分别称为设备类定义描述符和供应商自定义描述符。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

设备驱动程序INF文件的处理过程

Windows发现有USB设备连接时,其设备管理器会把系统所有的INF文件中的数据和该USB设备的设备信息或接口信息进行比较,已找到与之匹配的INF文件。对于Windows 98,为避免在每次检测到新设备时都需读取INF文件本身,他建立了一个保存INF文件调用信息的数据库,其文件名为drvdata.bindrvidx.bin,他们位于“Windows/INF”目录中。其中。drvdata.bin列出了INF文件所包含的产品信息;drvidx.bin列出了INF文件中的供应商ID和产品IDWindows在从USB设备中得到硬件ID或兼容ID后,它将利用这两个文件中的信息来查找与该设备相匹配的INF文件,其处理过程一般如下:

1Windows使用USB设备中设备描述符的供应商字段和产品字段(即idVendoridProductbcdDevice)来形成该设备的硬件ID,并查找与该应碱性匹配的INF文件。

2如果找不到,Windows将使用接口描述符的类字段、子类字段和协议字段(即bInterfaceClassbInterfaceSubClassbInterfaceProtocol)来形成该设备的兼容ID并查找与该兼容ID相匹配的INF文件。

3如果仍没有找到,则Windows将提示用户定位USB设备INF文件所在的目录,已安装正确的设备驱动程序。

       Windows 2000INF文件的处理过程与上述过程类似。

设备驱动程序安装的重要文件

INF文件

       INFDevice Information File设备信息文件)是一个文本文件,包含一个或多个USB设备、设备驱动程序和其安装过程的详细信息,如该设备使用哪个驱动、系统注册表中应存储哪些信息等,以确保其硬件设备能够正确的配置和安装。

       USB设备驱动程序安装完毕后,该设备的一些基本信息(如DeviceDescHardwaeID等)将被存储到Windows系统注册表中,驱动程序可执行文件和INF文件也将被复制到指定的系统目录中,且该USB设备将出现在Windows设备管理器中。对于Windows 98,它通常激昂INF文件复制到“/Windows/INF”目录中,将驱动程序可执行文件复制到“/Windows/system”目录中;对于Windows 2000,他们的复制目录分别是“/WinNT/inf”和“/WinNT/system32/drivers”。这些目录由INF 文件来指定。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\子键下显示了除ROOT_HUB(根集线器)外,也列出了所有曾经安装过和现在已安装驱动程序的设备的VID/PID。这里的VID/PID即决定了哪些驱动程序将会被加载。(如果你在设备管理器中卸载了设备的驱动程序,但是在这个位置还会保留它的信息,等你下次再装这个设备的驱动的时候,因为设备的VID/PID还是一样的,所以有的os会根据这个键下的VID/PID加载windows下的驱动,有的os会列出这个VID/PID曾经加载过的驱动的inf,当我们修改了设备的描述符时,如修改了端点的大小等,这时上位机驱动肯定修改了,不一样了,如果还是加载旧驱动,那usb就会出问题,所以我们在删除设备驱动时要一并把这儿的信息也删除,最好把windows/inf下的驱动inf也删除,这样我们在加载驱动时可以手动加载我们新写好的驱动了。当然我们修改设备的VID/PID也行,但显然在做产品时前者是可取的。)

当usb第一次被枚举成功时,会在历右下角弹出发现新硬件对话框,那是因为os虽然认识了这个设备,也知道了它有哪些功能,但它不知道要用这个设备的这些功能做什么,所以它要求我们安装这个设备的驱动,来告诉它用这个设备能做哪些事儿。安装好设备的驱动后,就会把设备的相关信息存入上面写的三个注册表路径当中。最重要的还是第三个路径,因为当设备再一次被插入的时候,os会找注册表的这个位置,看到有VID/PID与这个设备一样,就知道这个设备已经被自己认识了,所以就不会在右下角弹出发现新硬件的对话框。


每当用户重新插入设备或重新启动windows时,就会再一次执行设备枚举(这点非常重要)。

如果要删除某个设备,只是在设备管理器下执行删除是不够的,还要在注册表中将设备的项目删除掉,才能达到完全删除的目的。最后三个目录下的有关设备的信息全删掉。

对于ROOT_HUB的信息不能删,我们找不到它的加载驱动重新安装。


阅读(982) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~