- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于Windows系统下硬件IO的若干问题
关于Windows系统下硬件I/O的若干问题
摘 要:Windows操作系统屏蔽了系统硬件资源的访问权,设计专用的设备驱动程序成为系统设计者必须承担的工作。从计算机系统硬件资源访问的角度讨论了Windows下各种硬件资源访问方式的关键与具体实现,同时给出了具体的DDK代码示例。
关键词:内存,端口,驱动,内存直接访问
Issues of accessing the device resources in Windows system
Abstract:The engineers must undertake the tasks of programming windows drivers to access the hardware resources of the system for the rights to access hardware which are restricted by windows. The keys and the realization to access hardware are discussed from the point of view of system hardware access. The particular DDK codes are offered to show the way to access devices’ resources.
Key words:memory, port, driver, DMA
在以Windows操作系统为代表的视窗系统统治计算机平台的今天,必须通过设备驱动程序实现对硬件设备资源(I/O端口、设备内存、DMA通道)的访问与控制。系统开发商出于稳定性的要求将驱动程序架构定义的非常完备(DDK就是最典型的代表),使驱动程序的设计难度大大增加。第三方驱动程序开发工具(Driverstudio、Windriver等)将驱动程序架构进行了二次封装,驱动程序开发难度与工作量大幅降低,但二次封装带来的弊端是代码开放度下降,驱动程序的执行效率打折,当设备性能要求较高时还需求助于DDK。因此本文将就硬件设备资源访问的各种方式进行全面的解析。
1 驱动系统基本架构
1.1 Windows系统架构
在DOS时代,计算机系统工作在实模式下,应用程序可以直接面对硬件资源;但另一方面应用程序不加限制的运行使由于应用程序的错误操作造成系统崩溃(轻则系统突然复位,重则系统无法启动)的机会增大。
Windows操作系统对于系统的全面管理是自始至终的,应用程序的一切行为都在操作系统的监控之下,因此系统的稳定性得到了根本的提升,这一点在Windows NT系统问世后体现的尤为明显。
图1是Windows系统组成结构示意图。可以清楚看出windows操作系统的层次结构[1],真正的系统硬件处于系统结构的最底层,而且硬件平台的差异被HAL(硬件抽象层)所屏蔽,内核模式的各种组件通过HAL访问硬件。应用程序必须通过系统API接口把对于硬件的访问请求打包,通过I/O管理器传递给设备驱动程序,而所谓设备驱动程序就是处在ring0的专门管理某个设备的一段代码,不会独立地存在,而是操作系统的一部分。通过设备驱动程序,多个进程可以同时使用这些资源,实现多进程并行运行。
图1 Windows系统组成结构
1.2驱动程序架构
通常驱动开发环境最终生成的扩展名为sys的所谓驱动程序实际也是一种动态链接库,扮演着驱动例程的容器的角色,而这些例程则是完成管理硬件设备的必要例程。驱动程序中的各个例程就类似动态链接库中的导出函数,不同的是DLL中的导出函数被应用程序调用,而驱动程序中的例程是则是直接由系统调用。操作系统是通过一块被称作驱动对象的物理内存实现直接调用驱动例程。表1[2]罗列了KMD与WDM驱动对象的结构成员,灰色为不透明区域,类似于C++的私有成员。Windows系统启动过程中根据注册表信息为某个已知设备创建一个驱动对象,然后从硬盘加载对应的xxx.sys驱动程序,并且调用DriverEntry例程。
表1 驱动对象成员
Type Size DeviceObject Flags DriverStart DriverSize DriverSection DriverExtension DriverName HardwareDatabas FastIoDispatch DriverInit DriverStartIo DriverUnload MajorFunction DriverUnload、MajorFunction(函数指针表)、DrvierExtension-AddDevice(WDM)等在DriverEntry例程中要初始化的函数指针。虽然KMD
文档评论(0)