一个概括性的结构比较容易,介绍一个具体的系统功能也不难,可是Windows系统不是一个简单的层次结构下多个
具体功能实现那么简单。如果说第一篇的介绍让你感觉Windows系统象是在搭积木,那么接下来几篇Windows系统
机制方面的介绍,会让你感觉Windows更象是一锅粥——有点悲观,不过,我们的目的,就是锯开积木,探究其中的
纹理与脉络。先记住一句话,不管积木是什么形状什么颜色的,本质上它们都是一块木头。
机制,Mechanism。
金山词霸云: (1)有机体的构造、功能及其相互关系,如分娩机制;
(2)机器的构造和工作原理。如:计算机的机制。
请你把接下来的几篇关于Windows机制的内容,当作Windows系统中普遍存在的原理来理解。
2、Windows系统机制之一——对象模型
你一定用过Windows的资源管理器,即便是初学者也要经常点击桌面上那个“我的电脑”图标。资源管理器中,
计算机内所有的东西都一览无余,文件的打开、查找、替换、删除……还有控制面板、网上邻居……所有的文件和控制
命令都是一个按钮,差不多90%的日常操作都利用它来作为入口点。可是你只是Windows的一个用户,即便你是
Administrator,你也不过是一个超级用户,真正在控制计算机的还是Windows,它对你隐瞒了很多,当然,这也
是它的好处之一。我们用资源管理器来管理计算机,Windows则用对象管理器管理计算机的各种资源。先给你一个
利器,让你看到Windows对你隐瞒的一切,不过,目前还是仅能看看而已。
点击此处下载:http://www.sysinternals.com/files/winobj.zip
这个工具是对象查看器WinObj,它直观的显示了对象管理器数据库,注意不要与对象管理器混淆,对象管理器
是Windows的一种机制,实施资源控制操作。请留意对象的组织方式,“\”是根节点,我们平时所见的C盘在对象管理
器中名为“\Device\Harddiskvolume1”,这个是全局命名,很像linux及Unix下以“/”节点为根的目录树吧?再仔细
看,会发现你平时所见的Windows设备在\??这个节点下都有对应的对象与之对应。你将硬盘看作分区C、D、E、F……,
Windows将硬盘看作对象\Device\Harddiskvolume1、\Device\Harddiskvolume2、\Device\Harddiskvolume3、
\Device\Harddiskvolume4……,你将串口1看作COM1,Windows将它看作对象\Device\serial0……。你所知道的所有
计算机中的实体,Windows都把它们实现为对象然后当作对象来处理,进程、线程、文件、驱动、设备、桌面、事件……
在Windows里统统是对象,于是有了各种对象句柄handle。句柄看起来是个32位整数(想起了研一时对句柄这个东东
的疑惑),本质上是为了安全的访问对象而提供的对对象的间接引用。你可以把Windows对象跟普通C++程序的类关联
起来理解:文件的创建(CreateFile)会返回一个文件句柄,创建文件的过程可以理解为类的构造方法,写文件、读文件
这些操作,其实都是文件对象的方法。
好了,废话说了不少,我们正式开始介绍Windows对象模型。
Windows为了能够一致而安全的访问在执行程序中实现的各种内部服务而实现了对象模型。如前篇所述,执行程
序Executive是内核态的,也就是说在应用级别我们是看不到对象的,只能通过句柄handle来实现对对象的访问。尽
管我们可以在程序中创建文件,操作文件,但是实际的操作都是在内核级别完成的,你执行的操作都是Windows给你
规定好的,除了调用它给你提供的函数,你没有别的选择,你所拿到的只有一个句柄和一组规定好的操作。另一方面,
有些执行程序级别的对象往往包含一些原语级别的对象,由更底层的内核来提供。如此对象就有两类,执行程序对象
和内核对象。我们不探讨内核对象和执行程序对象之间究竟什么关系,没有太多意义。我们仅通过讨论执行程序对象
让大家看到对象的一些属性和操作,对对象有更深的理解,不至于只知道利用handle来执行操作,只知其然而不知其
所以然。
维护一份爱情或是友情,往往需要换位思考,我们也来个换位思考,站在Windows设计者的角度思考为什么要
采用对象模型,对象模型应该具备什么特性。这样理解起来至少会少一些莫名其妙。先提需求:
需求一:计算机拥有各种各样的资源,不同的资源使用起来的方法是不一样的,这件事情如果让应用开发者来做,
他一定会烦得要死,所以Windows必须提供统一的资源使用机制,这必须对各种资源的共性进行抽象,对象化的方法
无疑是不错的选择;
需求二:Windows 2000的设计目标之一是要实现C2级的安全,简单点说Windows要对资源采取一定的保护机制,
落实到实现上,必须提供对象的保护属性和方法;
需求三:从磁盘到显示器,计算机的东东可是太多了,必须采取一定的管理机制,比如对象的分类、统一命名等;
需求四:每个对象如果仅供一个进程或是仅供内核使用,效率太低浪费严重,内核的信息永远也传不到应用程序,
应用程序也访问不到内核,使用对象模型的重要目标之一就是要通过受保护的对象来完成应用对内核提出请求以及内核
对应用进行服务。因此,一个对象可能同时供内核和多个应用进程使用,必须有一种计数机制来保证对象的生存期。
对应每个需求,我们自己可以做一些分析和设计,你可能会有比Windows更好的设计方案,如果你真的能设计出可
实现的方案并有能力付诸施行,恭喜,我们国家自己的OS有一定希望了。不过,我们还是先来看看MS的设计吧,下面每
个设计对应上面的每个需求,这些正是Windows上正在运行着的机制。
设计一:对象要有以下基本属性:对象名(标识对象)、对象目录(对象名存储位置),这两者类似于文件管理器
里所见的文件名和文件目录。所有对象具备的通用操作:关闭(最常用的closehandle函数)、复制、查询(获得对象
的属性信息)、等待单个对象(用一个对象同步一个线程)、等待多个对象(用多个对象同步一个线程)。出于性能上
的考虑,各类对象有单独的创建、打开等操作。
需要说明一点,对象化的抽象是软件设计中比较难的问题,而且也没有统一的标准,不要因为看到只有这几个有限
的操作就觉得简单,MS的工程师在这个问题上一定费了不少心思。
设计二:安全。最常见的安全机制就是多级安全,再具体一点可以明确每个级别能够做什么事。Windows对象也是
如此。在对象属性中包含了一个安全描述符属性,通过它来决定谁能使用对象和对对象能执行什么样的操作。这个“谁”
可以是进程、线程或是其它的对象,也可以是一个用户令牌。同时,要增加安全方面的操作,包括查询安全(取得对象
的安全描述符)和设置安全(通过修改安全描述符改变对象的保护属性)。关于安全方面的详细内容后面将有专门的篇
章介绍。(这文章写的比较早了,那时对访问控制的理论和技术理解甚浅,以后撰文另述吧。)
设计三:对象管理。这就是你在工具WinObj中看到的内容。Windows执行程序共实现了27类对象类型,通过一种
特殊的对象——类型对象来描述这27类对象,在ObjectTypes对象目录下可以看到。但是很多对象只能供执行程序自己
使用,比如说驱动对象等。只有对象目录\??和\BaseNamedObjects下的对象对用户程序是可见的,不过基本上都是符
号连接,有点类似Linux上的文件连接。现在对象属性中又添加了一个对象类型属性。
类型对象中包含了某类对象的公有信息,比如这类对象的访问类型(只读还是可读可写)、该类对象可在的内存类
型(是页式内存还是非页式内存)、该类对象的方法(如前述所言,有些操作是按对象的不同类型分别实现的,这是一
些例程,定义了在执行比如对象的打开、关闭等操作时应该做什么)。
设计四:对象计数。进程和内核都使用对象,进程使用对象是通过对象句柄,内核使用对象则直接通过引用。在对
象属性中添加三个属性,打开的句柄数,打开的句柄数链表(里面记录是哪些进程打开了该对象的句柄)和引用计数(记
录了内核对该对象的引用次数)。每有一个进程打开该对象,则打开的句柄数加1,同时引用计数加1,而内核对对象的
引用次数增加仅仅增加引用计数。打开的句柄数和引用计数都为0时才关闭该对象,释放资源。
经过如上的分析,Windows对象的基本结构出来了。如附图示,一个对象由对象头和对象体构成,上述内容主要在
对象头内,是每个Windows对象的公共属性。Windows对象管理器通过对象头来管理对象而不考虑对象类型。对于相同
的对象类型而言,对象体的格式都是相同。
如前所述,对象拥有对打开它句柄的进程的记录,而Windows进程中则拥有一个进程句柄表,记录着该进程打开的
所有的对象句柄。进程句柄表采用3级方案实现,很类似x86内存管理器实现虚拟地址到物理地址内存的转换。这一点在
后面讨论进程结构时将再次提到。
本篇主要讨论了Windows对象模型,内容比较抽象,我绞尽脑汁以资源管理器做为一个对比,但是总觉有不当之处。
对象是位于文件、设备、进程等这些比较具体内容之后的、对用户级别不可见的一种抽象化的机制。编程时直接面对的
还是这些具体内容,我想要陈述的是这些具体内容的规律,比如对文件、进程等进行访问时,都是首先获得句柄,然后
要提供访问方式,还要有访问权限位,访问完毕要关闭句柄。一个新手面对浩瀚的MSDN和SDK文档望洋兴叹,老手程序
写多了会说这些东西都差不多,深究起来也是茫然。本文旨在帮助大家看到本质,不指导具体编程也不解决实际问题。
其实,如果对Windows的机制理解够深,解决具体问题的方案会比较容易的出现在你脑子里,剩下的就是写程序了,注
意不要眼高手低即可。
浙公网安备 33010602011771号