windows的分层驱动--内核实现的一种方式
来源:互联网 发布:知乎 重庆鸳鸯锅 编辑:程序博客网 时间:2024/06/03 13:09
古老的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://www.douban.com/group/topic/11015284/
- windows的分层驱动--内核实现的一种方式
- windows的分层驱动--内核实现的一种方式
- 关于windows ce串口驱动的分层
- .Net 中 C/S架构软件的一种分层方式
- 一种基于智能卡登录Windows系统的实现方式
- 分层驱动的概念
- 精简Linux内核的一种方式--localmodconfig
- 精简Linux内核的一种方式--localmodconfig
- MVC的一种实现方式
- hotfix 的一种实现方式
- Windows操作系统的分层
- Driver 分层的思想 -- Linux Kernel 内核实现欣赏
- 设备驱动的分层思想
- 驱动分层的概念--转
- 一种执行分布式分层工作流的接口
- 两个 select 联动的一种实现方式
- C++反射的一种实现方式
- ssh框架的一种实现方式
- IPv6 地址格式
- Android的Task和Activity相关
- sys_fork()
- VSS (Visual Source Safe 2005) 用法详解
- 关于引用exchange webservice做二次开发的一些问题
- windows的分层驱动--内核实现的一种方式
- 程序设计原则(整理)
- 创建合同时获取可配置物料中选配的特性值
- [转载] Linux内核2.4.x的网络接口源码的结构
- Android常见布局控件之LinearLayout和TableLayout
- 三足鼎立
- (转)详细设计说明书
- 更改 IE 代理服务器的设置
- Oracle ASM 详解