WinCE之旅——驱动编程学习笔记2

       昨天把流驱动看了一下,总体感觉相对还可以,其实大多数情况就是编写dll动态链接,这个不是太难,只要多练我想我应该能熟练掌握。话说回来,今天是著名的圣诞节,大家都过节了吧,我也过,在实验室,今天下午暖气停了,有点冷,不过写东西的时候感觉手还是挺灵活的,这要谢谢我散热不好的笔记本,现在才体会到,散热不好并非坏事,不用暖手垫嘛!呵呵,言归正传,继续我的驱动编程学习……

      设备驱动程序架构:

        内置与流安装机制:通常内置驱动程序根据注册键值安装在 GWES进程空间;
                                   总线驱动由Device.exe根据键值进行安装;
                                   可安装的流驱动或其它驱动由Device.exe根据总线驱动或注册检查器进行安装。

        设备驱动程序的安装过程:Kernel—》DEVICE.EXE—》I/O Resource Manager (part of Device.exe)、REGENUM.DLL—》

                                            PCIBUS.DLL

        注册枚举器:     注册枚举器是RegEnum.dll
                             Device.exe根据HKEY_LOCAL_MACHINE/Drivers/RootKey安装注册枚举器
                             注册枚举器给每一个要安装的驱动程序扫描表项
                             注册枚举器是可重入的,并支持分级使用
                             当注册枚举器卸载时,同时也御载它安装的所有信息
                             注册枚举器根据Order,检查紧挨着传给它的键的下一级键值。
                             注册枚举器对每一个找到的子键调用ActivateDeviceEx

        ActivateDeviceEx:   由Device.exe提供
                                       总线驱动程序当安装设备驱动时调用ActivateDeviceEx
                                       ActivateDeviceEx也在RAM工作区锁定流接口驱动程序
                                       这可以防止代码页被丢弃
                                       注册检查器对找到的每一个内置子键调用ActivateDeviceEx
                                       ActivateDeviceEx安装驱动并更新注册表

        接口类:  驱动程序的接口有以下特征
                            1.每一个Iclass有一个GUID,一个名字
                            2.GUID描述类设备接口
                            3.Name 描述接口的实例(COM1:, DSK1: 等等)
                      提供一个驱动接口
                            1.在注册表中的Iclass子键
                            2.驱动程序发布接口  – AdvertiseInterface
                      应用程序访问接口 – RequestDeviceNotifications
                      每个已有的接口的预定义GUID(例如:A32942B7-920C-486b-B0E6-92A702A99B35 )

           I/O资源管理(IORM):IORM是设备管理器必备的部分
                                           跟踪可用I/O资源 (IRQ与I/O基地址)
                                           OEM为内置设备预分配的资源
                                           当在总线上安装一个客户驱动时,总线驱动请求资源
                                                    1.ResourceRelease
                                                    2.ResourceRequest
                                                    3.ResourceCreateList
                                            当存在冲突时IORM调用 ResourceRequest失败
      注册表帮助例程:1.从注册表中读取资源初始化信息
                                               OpenDeviceKey
                                               DDKReg_GetIsrInfo
                                               DDKReg_GetWindowInfo
                                               DDKReg_GetPciInfo
                                               在COREDLL的API
                                               在<devload.h> and <ddkreg.h> 的函数原型
                               2.在public/common/oak/drivers中的例子
                                                wavedev/pdd/es1371/wavepdd.cpp -> GetRegistryConfig

         电源管理: 1.电源管理器:灵活的系统级与外设级电源管理

                                              使设备智能化的管理它们的电源

                                               在设备与系统或应用之间充当协调者

                                              使OEM修改调用PowerOffSystem()的相关代码

                          2.系统电源状态:打开—>系统空闲; 用户空闲—>挂起;

                          3.设备(外设)级电源状态:D0全供电;D1降级模式;D2备用模式;D3睡眠;D4关闭;

        内存管理函数:设备驱动程序是用户态模块 (必须将物理内存映射成虚拟内存)
                             VirtualAlloc, VirtualFree: 预留,释放虚拟内存(MEM_RESERVE)
                             VirtualCopy:  将一个物理内存区域映射到一个虚拟内存区域(PAGE_NOCACHE;PAGE_PHYSICAL)

        驱动的内存访问与映射:  MapPtrToProcess(将一个地址空间的指针映射成另外一个指针)
                                           GetCurrentProcess / SetProcPermissions(重新找回进程ID用于MapPtrToProcess函数)
                                           MmMapIoSpace(将一个物理地址空间映射成一个不分页的,由进程决定的地址空间)

        说了以上这么多,应该到重点的DDk了。

        CEDDK:      CE v2.1x 以及后来的版本支持独立于平台的I/O配置
                            让OEM以及驱动开发人员使用它们
                            CEDDK.DLL: 总线管理
                                                  内存管理
                                                  I/O管理
                            从NTDDK拿来的CEDDK API(直到V2.12以后的版本才有文档;但在大多数V2.00版中都有)
                             硬件<—>CEDDK.DLL<—>设备驱动<—>设备管理器

            设备驱动使用CEDDK;正常开发的驱动是跨平台二进制兼容的(跨CPU的源码兼容)

                             CEDDK 内容:部分                                                     函示例
                                                 总线管理                                               HalGetBusDataByOffset()
                                                                                                            HalGetBusData()
                                                                                                            HalSetBusDataByOffset()
                                                                                                            HalSetBusData()
                                                                                                            HalTranslateBusAddress()
                                                                                                            HalTranslateSystemAddress()
                                                   内存管理                                             MmMapIOSpace – MmUnmapIOSpace
                                                                                                            HalAllocateCommonBuffer
                                                   I/O 存取
                                                   XXXX =>UCHAR/USHORT/ULONG       READ_REGISTER_XXXX
                                                                                                             WRITE_REGISTER_XXXX
                                                                                                             READ_PORT_XXXX
                                                                                                             WRITE_PORT_XXXX

        先吃饭,后学习,身体是革命的本钱!饭是身体的保障!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值