Thursday, March 24, 2011

关于User-Mode Driver Framework(UMDF)的一点感想

关于User-Mode Driver Framework(UMDF)的一点感想

最近又要在WINDOWS下面写点驱动,于是学习了下目前比较流行的WDF,主要是UMDF。因为以前用过一阵WDM,所以对KERNEL MODE的KMDF兴趣不是特别大。

WDF的全称是Windows Driver Foundation,其中又包括了UMDF和KMDF。前者是USER LEVEL的驱动,后者是KERNEL LEVEL。在WDF出来之前,流行的WINDOWS驱动结构叫做WDM (WINDOWS DRIVER MODEL)。在WDM之前,WIN NT和WIN 95的驱动模式是不一样的。WIN NT的比较规范,什么东西都只能在内核做。NT这一套一直发展下来,变成了后来的WDM, WDF。不知道未来又会出现啥新名词。WIN 95那一套很多地方限制没有那么严,这同时也造成了OS不够稳定。在WIN 95 之前,就是 WIN 3.X 和纯真的DOS年代了。现在的BIOS依然纯真,不过马上就要变成复杂的UEFI了。。。。=。=

回归正题,以前刚学WDM的时候,就被告知一切对硬件的操作都必须要在KERNEL LEVEL做才行。于是形成了一个思维定势,只有KERNEL LEVEL才可以操作硬件。多年以后,开始学习LINUX,惊讶的发现LINUX下面是可以允许USER LEVEL APP直接访问硬件端口的。再看INTEL 手册,发现硬件并没有设计成只能在KERNEL LEVEL才能访问。。。这时才明白,原来WINDOWS是故意那么设计的。。。

LINUX下的USER LEVEL APP也是有ROOT权限才可以访问硬件端口。同时也有一些限制,比如处理中断和DMA.不过能访问端口本身已经提供了很多方便。有的时候,只想写个小程序访问2、3个IO 端口。这个在LINUX下很简单,在WINDOWS下就要自己写驱动,或者借助其他工具和库了。

后来某一天,惊闻WINDOWS最新的UMDF也是在USER LEVEL下的驱动。于是心想,是不是WINDOWS终于想明白,要跟LINUX学,允许USER LEVEL APP 访问端口了呢?本来我以为是这样的,但是一直没仔细看UMDF。今天看了一下后,找了半天,也没有看到类似LINUX那样可以直接访问端口的东西。最后发现,UMDF还是要用FILE OBJECT 去访问那些硬件。。。也就是说WINDOWS下直接在USER LEVEL APP访问IO端口的梦想又泡汤了。。。

看来WINDOWS并没有更改他们的设计观念,UMDF也和LINUX下的东西有很大区别。当然,UMDF本身还是有一些优点的,让某些驱动的编写容易了很多,不用再工作在内核下,不再受很多限制了。另外一个有点惊讶的是,UMDF居然是基于COM的。当然也没有用到COM的全部功能,只是用了一点。不过这个也可以看出,COM这个东西还是比较成功的。感觉UMDF这个东西就是一个APP和DEVICE DRIVER的混合体。UMDF可以提供一些设备的符号链接,接受其他用户程序的调用,这点上比较像个驱动。但是在UMDF真正要访问硬件的时候,它又不能自己干,还要调用底层的KERNEL DEVICE DRIVER。还要用啥FILE OBJECT之类的。从这个角度看,UMDF也很像一个用户程序。

WDF最早也是跟着VISTA出来的。话说VISTA从技术上说还是不错的,可惜用户体验方面做的差了点,变成了一个失败的产品。又一次验证了光有技术是不够的。。。

No comments: