分类: 嵌入式
2013-08-08 19:07:26
执行硬件中断请求
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留给鼠标使用。利用相同的原理,合理分配各硬件设备的中断号,将使你的系统性能佳。
键盘、打印机、磁盘等等设备的中断请求是由中断控制器(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找到对应的中断处理程序的。
设备驱动程序INF文件的处理过程
当Windows发现有USB设备连接时,其设备管理器会把系统所有的INF文件中的数据和该USB设备的设备信息或接口信息进行比较,已找到与之匹配的INF文件。对于Windows 98,为避免在每次检测到新设备时都需读取INF文件本身,他建立了一个保存INF文件调用信息的数据库,其文件名为drvdata.bin和drvidx.bin,他们位于“Windows/INF”目录中。其中。drvdata.bin列出了INF文件所包含的产品信息;drvidx.bin列出了INF文件中的供应商ID和产品ID。Windows在从USB设备中得到硬件ID或兼容ID后,它将利用这两个文件中的信息来查找与该设备相匹配的INF文件,其处理过程一般如下:
1Windows使用USB设备中设备描述符的供应商字段和产品字段(即idVendor、idProduct、bcdDevice)来形成该设备的硬件ID,并查找与该应碱性匹配的INF文件。
2如果找不到,Windows将使用接口描述符的类字段、子类字段和协议字段(即bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol)来形成该设备的兼容ID,并查找与该兼容ID相匹配的INF文件。
3如果仍没有找到,则Windows将提示用户定位USB设备INF文件所在的目录,已安装正确的设备驱动程序。
Windows 2000中INF文件的处理过程与上述过程类似。
设备驱动程序安装的重要文件
INF文件
INF(Device Information File设备信息文件)是一个文本文件,包含一个或多个USB设备、设备驱动程序和其安装过程的详细信息,如该设备使用哪个驱动、系统注册表中应存储哪些信息等,以确保其硬件设备能够正确的配置和安装。
在USB设备驱动程序安装完毕后,该设备的一些基本信息(如DeviceDesc、HardwaeID等)将被存储到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的信息不能删,我们找不到它的加载驱动重新安装。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
windows处理硬件中断请求
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
描述符
USB采用USB标准描述符说明一个USB设备,这些描述符包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。对于高速设备还包括设备限定描述符和其他速率配置描述符。设备类和供应商也可以自己定义其设备专用描述符,分别称为设备类定义描述符和供应商自定义描述符。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------