驱动程序资源管理是编写设备驱动程序的一个核心,它由以下几部分组成:
l 资源管理器;
l 中断处理和IST模型;
l 设备驱动程序内存管理。
1.资源管理器
系统的资源(包括IRQ和I/O空间)是由系统表配置和定义的。
2.中断处理和IST模型
WinCE提供了一个有效的中断处理机制,它把对中断的处理分为两部分:中断服务例程(ISR)和中断服务线程(IST)。ISR通常要求短小精悍,效率要求很严格。它只决定该怎样处理这个中断,一般情况下不应该做太多的工作。大部分工作依靠IST处理,如将数据移到缓存或处理用户某些特殊要求的工作。
WinCE中断处理模型如下图所示
WinCE支持两种ISR:静态ISR和可安装ISR。静态ISR只能静态地编译进内核,运行时不能改变。与IST通信时,它也只能是单向的,即由ISR到IST。静态ISR支持嵌套中断,并且使用内核堆栈。可安装ISR由内核管理程序从动态链接库中加载。和静态ISR不同,它和IST的通信是双向的,多个ISR可以与同一个中断请求相关联,系统按照加载驱动的顺序依次调度。在可安装ISR中,共享内存的使用也比较灵活。
① 当一个硬件中断发生时,它被发送到内核的异常处理器(Exception Handler), 内核处理这个异常。
② 内核的中断支持处理器(Interrupt Support Handler)调用OAL函数OEMInterruptdisable。这个函数通知硬件屏蔽来自于这个硬件的特定中断直到结束必要的处理,而所有其他中断仍是可用的。
③ 内核调用ISR(中断服务例程)来响应中断。
④ 内核收到ISR的返回值,依据该返回值决定如何处理中断。
⑤ 内核触发的中断支持管理器来触发唤醒中断服务线程(IST)并完成它的工作。
⑥ 当中断服务线程(IST)被唤醒时,它做处理中断要做的所有工作。
⑦ 如果需要,IST调用各种I/0函数(I/O Routine)访问硬件来完成工作。
⑧ 中断处理结束后,调用InterruptDone函数通知内核。
⑨ 内核调用OEMInterruptDone完成整个中断处理过程,0AL函数(OAL Routine)通知底层硬件重新开启这个中断。
3.设备驱动程序内存管理
WinCE驱动程序的内存管理涉及的有如下四个方面:
(1)WinCE的地址空间
虚拟到物理物理之间的映射是设备相关的,物理内存被映射到2GB~3GB的虚拟空间区域,而驱动程序的物理内存将被映射到3GB以上的空间区域。
(2)内存管理函数
VirtualAlloc、VirtualCopy、MmMapIoSpace、MapPtrToProcess、GetCurrentProcess、SetProcPermissions