windows的分层驱动--内核实现的一种方式

晨曦之光 发布于 2012/04/10 15:01
阅读 155
收藏 1

古老的unix提出了一切皆文件的思想,近代的OO提出了一切皆对象的理论,在unix的年代,人们迫切需要的是如何操作计算机而不是如何设计软件,毕竟那个时候软件设计其实比现在简单,就那么几种,关键是没有人会操作计算机,而OO年代,软件成了一种工业产品,此时不管是追求利润也好,XX也罢,人们的计算机操作水平被windows拉到了一个很高的层次--如此复杂菜单加菜单的方式。使用软件成了人们日常生活的一部分,因此问题就成了如何快速开发出软件,因此也就有了OO,甚至更新的面向YY编程。windows正好出现在unix年代和OO年代交替的时期,因此注定成为了一个很成功的操作系统,我不关心windows的应用,这个随便一个人都能说很多,仅仅从windows内核的设计上来讲,就有无限乐趣,当然我最喜欢的还是linux,不过这两种操作系统在设计哲学上真的各有可取之处。

在内核中,windows使用两个概念包含所有的内核模块,这就是driver和device,当然真正的文档会用大写字母表示,这也是windows的一贯作风,为了体现OO,还会加上下划线和大写的object等字样来定义结构体。认真看了windows关于内核的资料和亲自调试了一番之后我觉得windows内核真的不错,任何对内核的请求几乎都可以用irp来表示,irp请求的发起者是用户,而执行者正是device,具体怎么执行就是driver的事情了,这是典型的C/S模型,很是清晰。人们可以轻松的对内核行为进行过滤,这是因为windows的内核模型是由device-driver-irp实现的,而后者就是一个分层的模型,一个device可以被“绑定”到任何一个别的device的上面,所有的device组成一个设备栈来共同实现用户的请求,设备栈中的各个设备可以由相同的driver来提供服务,也可以由不同的driver来提供服务,以网络数据过滤为例,虽然linux的netfilter已经是很成功的了,硬编码了5个钩子,人们能实现的仅仅是过滤策略,而对过滤点几乎不能做什么,但是对于windnows的分层模型,过滤点可以随意设置,只需要attach一个需要被过滤的device即可,而过滤策略由该自定义的device的driver来提供,是不是很灵活呢?我们姑且不考虑安全问题,仅从设计上讲,windows就比linux灵活很多很多,然而安全毕竟是操作系统的首先要考虑的因素,因此linux会更加安全,因为linux中的过滤点几乎都是写死的,从netfilter到lsm都是写死的代码,除非你完全修改了内核,否则想通过加载一个内核模块来实现一些不可告人的事情会比windows困难很多很多,比如想过滤文件系统的读写请求,linux没有提供现成的device供你attach,暴露给你的只有file_operations,你需要做的就是替换掉这个结构体中的回调函数指针,然后还要做很多善后处理,这显然不是一种标准的做法,标准的做法就是自己实现一个file_operations,然而除非你修改内核,否则内核绝对不会给你提供一个在一个fops上attach另一个fops的内核API的,而对于windows,这却成了最简单的事情,直接attach一个卷,然后实现过滤,因此windows中暴露给你的是device而不是driver,driver只是为一个或一系列device实体提供服务的,别的什么也不做,反过来device不关心自己的操作怎么实现,你只需要用拥有另一个driver的device来attach这个device即可,irp往下流动时会按照先经过绑定device在经过真正device的顺序流动,所有的这些接口linux都没有提供,linux提供的接口不允许你修改任何内核机制,允许修改的仅仅是内核机制的实现策略,或者内核模块中允许你实现一个和当前内核不搭界的特有功能,比如netfiler和lsm事先确定不可更改的过滤点,然后允许你自己实现策略,过滤点是不能更改的。

很多人都说windows不安全,而linux安全,这是因为在linux上很多人都被限制使用root权限,而对于windows,由于它是个人操作系统,最起码说它偏向于个人或者中小型服务器,人们大肆的开发administrator权限,因此才导致了不安全,我敢说如果给了linux所有用户root权限的话,那么linux也不会安全到哪去。先在考虑另外一个问题,那就是如果linux被给了root权限,而windows也被授予了administration权限的话,攻击linux困难在哪?对于windows来讲,你可以写一个驱动来实现任何事情,内核虽然不让你看,但是提供了很多的接口,而对于linux,虽然内核让你看,可以由于没有提供一个接口,因此你即使加载内核模块也不能轻易实现某些事情,你需要做更多的事情,比如搜索内核内存,然后修改之,能做这件事的人一定是高手了,而能写一个驱动载入windows的人却不一定是,这一点上和写用户空间应用程序没有什么区别,都是照着api文档编程罢了,编译器不同,api不同罢了,这一点上,谁更安全呢?

windows的分层内核模块模型更像是在堆积木,而linux中写死的代码更像是一体式的框架结构。


原文链接:http://blog.csdn.net/dog250/article/details/5303616
加载中
返回顶部
顶部