240 likes | 429 Views
设备管理器. 本节课程主要知识点 设备管理器 I/O 资源管理. 重点和难点. 重点 设备管理器 难点 设备管理器 I/O 资源管理. 设备管理器. 设备管理器. [HKEY_LOCAL_MACHINEinit ] "Launch20"=" device.dll “. 设备管理器的运行. 设备管理器 device.dll 是由 kernel.dll 加载到内核空间。 设备管理器是 Windows CE 设备管理的核心,负责对所有设备的驱动程序管理。 虽然不是内核中的进程,但设备管理器在 Windows CE 中的地位非常重要。.
E N D
设备管理器 本节课程主要知识点 • 设备管理器 • I/O资源管理
重点和难点 重点 • 设备管理器 难点 • 设备管理器 • I/O资源管理
设备管理器 • [HKEY_LOCAL_MACHINE\init] • "Launch20"="device.dll“
设备管理器的运行 • 设备管理器device.dll是由kernel.dll加载到内核空间。 • 设备管理器是Windows CE设备管理的核心,负责对所有设备的驱动程序管理。 • 虽然不是内核中的进程,但设备管理器在Windows CE中的地位非常重要。
设备管理器组件 • 设备管理器由 Device.dll 和 Devmgr.dll 组成。Device.dll包含 Devmgr.dll,后者实现了核心设备管理器功能。 • 设备管理器的源代码可以在以下目录下看到 • C:\WINCE600\PRIVATE\WINCEOS\COREOS\DEVICE
设备管理器在系统中的位置 User Mode Udevice.EXE Udevice.EXE Windows CE Application Shell ServicesD.EXE User Mode Driver n Service 1 User Mode Driver 1 Service n Win32 CE APIs – COREDLL / WINSOCK / COMMCTRL / COMMDLG Kernel Mode KERNEL.DLL K.COREDLL.DLL DEVMGR.DLL GWES.DLL FILESYS.DLL Networking DLLs FSDMGR.DLL OAL Drivers Hardware – RAM, ROM, INTs, USB, SD, TOUCH, DISPLAY, 802.11, KEYBOARD, … Microsoft OEM ISV
内核模式的驱动程序 • 驱动程序除非在注册表中设定了DEVFLAGS_LOAD_AS_USERPROC标志,否则设备管理器将加载该驱动到内核空间。 • 运行在内核空间的驱动程序会有良好的表现,因为它们可以通过k.coredll.dll直接调用内核的API函数。也可以直接访问用户的地址空间。 • 必须很健壮,驱动程序的崩溃可能会导致系统崩溃。
用户模式的驱动程序 • 如果驱动程序在注册表中设定了DEVFLAGS_LOAD_AS_USERPROC标志,则设备管理器将加载该驱动到用户空间。 • 用户模式下的驱动程序由udevice.exe来管理。 • 不能访问内核空间的地址。 • 用户模式的驱动程序增强了系统的稳定性。
设备管理器的任务(1) • 加载驱动程序的DLL文件到内核或用户的地址空间内。 • 系统启动或新设备接入时加载该设备的驱动程序;不需要该设备时,卸载其驱动程序。例如,在用户插入一个SD卡时,设备管理程序就试图寻找该SD卡的驱动程序并加载。
设备管理器的任务(2) • 统一管理驱动程序,通过读写注册表加载、跟踪驱动程序。 • 实现并提供用户设备管理的API函数,应用程序可以通过这些函数对设备进行访问。 • 提供电源管理接口。 • 提供对I/O资源的管理。
设备的初始化 • Windows CE的设备初始化分为两个阶段。 • 首先是Device.dll的初始化。 • 其次是外设的枚举和加载。
Device.dll的启动 • Windows CE在设备上启动后,操作系统内核NK.exe首先运行,NK会根据注册表项 • [HKEY_LOCAL_MACHINE\init] 依次启动一些程序。 • Device.dll启动后,进行自身初始化工作,以完成设备管理功能。
Device.dll的初始化 • Device.dll启动后 • 初始化所用到的一些数据结构。 • 初始化I/O资源管理器。 • 初始化电源管理器。 • 根据注册表的设置,加载BusEnum.dll,让BusEnum.dll负责加载和初始化所有的内置设备。 • 控制权交给BusEnum,Device.dll任务完成。
BusEnum.dll • BusEnum.dll称为总线枚举器,主要完成外设的枚举和加载。 • Windows CE提供了BusEnum.dll的源代码,在如下的文件夹下 • C:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\BUSENUM\BUSENUM • BusEnum.dll是可重入的。 • 仔细分析下其源代码。
BusEnum.dll的加载 • Device.dll启动后,会在注册表项 • [HKEY_LOCAL_MACHINE\Drivers\RootKey] 下读取BusEnum.dll。 • 通常RootKey的值为Driver\BuiltIn。 • 根据RootKey的值,Device.dll会加载总线枚举器BusEnum.dll。 • BusEnum.dll加载是通过ActivateDeviceEx函数加载的。
外设的枚举和加载 • BusEnum.dll加载后,ActivateDeviceEx函数调用BusEnum.dll的导出函数Init()。 • Init()会根据注册表的设置,会遍历 • [HKEY_LOCAL_MACHINE\Drivers\BuiltIn] 下的所有子键,并加载相应驱动程序。 • 驱动程序加载后,会根据加载的顺序在注册表子键 • [HKEY_LOCAL_MACHINE\Drivers\Active] 添加一个子键记录已加载的驱动程序。
ActivateDeviceEx函数 • ActivateDeviceEx函数对于加载驱动程序非常重要,根据注册表信息加载驱动程序的过程就是由该函数完成的。 • 卸载驱动是通过DeactivateDevice完成的。 • 课程中安排有利用该函数加载驱动程序的完整实例。
ActivateDeviceEx函数原型 • 接口 HANDLE ActivateDeviceEx( LPCWSTR lpzaDevKey, //指向该设备驱动程序在注 册表中的注册键的路径 LPCVOID lpRegEnts, //REGINI结构数组头指针 DWORD cRegEnts, //REGINI结构数组成员个数 LPVOID lpvParam , //通常为NULL ); • 返回 • 当前驱动程序注册的句柄
设备管理器与应用程序通信 • 用户应用程序可以通过文件系统 APIs 使用流驱动程序,比如 ReadFile 和 WriteFile。 • 对应用程序而言,设备驱动器 通过文件系统公开的流驱动程序,就像具有特殊文件名的正常文件资源。 • DeviceIoControl 函数使应用程序能够执行直接输入和输出操作。但是,在这两种情况下,应用程序都通过设备管理器 间接与流驱动程序交互。
I/O资源管理 • I/O资源主要是指IRQ和I/O地址。 • 设备管理器提供专门的资源管理器负责对IRQ和I/O地址资源进行管理,同时记录当前系统中的IRQ和I/O地址的占用和可用情况。
I/O资源管理的任务 • I/O资源管理器跟踪设备驱动程序装载前从注册表信息中获得的设备初始化所需的系统资源。 • 这些资源包括IRQ的集合与I/O地址空间。 • 这些资源的初始化状态在注册表中配置 • IRQ状态 [HKEY_LOCAL_MACHINE\Drivers\Resources\IRQ] • I/O地址状态 [HKEY_LOCAL_MACHINE\Drivers\Resources\IO]
I/O资源管理的组件 • devcore 提供核心设备管理器功能。 • iorm 提供 I/O 资源管理器功能。iorm是必需的组件且无法移除。 • Pmif 提供了电源管理器 DLL 入口点的接口。 • Nopmif Nopmif 提供了电源管理器入口点的存根版本。