内核对象之一 “什么是内核对象”

上一篇 / 下一篇  2008-11-13 20:55:43 / 个人分类:Windows编程相关

  在OS来说,有些东西是他认为应用程序不应该直接访问和操作的,比如我们调用CreateProcess()创建了一个进程,OS会分配一个内存块来维护与这个进程相关的信息,这个内存块就不应该由应用程序直接访问和操作,而是调用相关的函数间接操作,我们称这种内存块叫内核对象(Kernel object)。除了进程对象外,文件对象、事件对象、令牌、信号量等很多的对象都是内核对象。所以说内核对象是一个作为某种数据结构的特殊的内存块。

  内核对象的拥有者既然是操作系统,又不允许我们直接访问,那我们如何操纵他呢?答案是利用windows提供的函数。但就是用函数也应该有一个标示内核对象的东西来告诉你调用的函数你想操作的是哪一个内核对象,所以,就有了句柄。操作系统返回句柄来标示内核对象,我们得到了句柄后,虽然知道他指向谁,但不知道指向的对象在哪里,我们只能给操作系统传递这个句柄,让操作系统来通过某种算法找到他指向的内核对象。而且更不幸的是,句柄是进程相关的,就是说,一个应用程序通过某种手段得到了一个句柄,在他的所有线程中,这个句柄标示同一个内核对象,但是这个句柄的值对其他进程来说完全是不同的意义(“跨进程边界共享内核对象”是可能的,不过要通过其他机制)。

  内核对象维护成员变量这些代表对象信息的成员,只有少数的成员(安全描述符和使用计数)是所有对象都有的,但大部分是不同类型的内核对象特有的。如,进程对象有一个进程ID,一个优先级和一个退出码。

  说到这里,大家应该也就知道啥是内核对象了,也明白了操作系统是如何小心的保护内核对象。当你想创建内核对象的时候,我们只能调用操作系统的函数创建,而且他返回的还是一个只有操作系统才明白其具体意义的称为“句柄”的东西,有了句柄这个玩意,你与内核对象相关的所有操作 OS都知道。而且,所有创建内核对象的函数都有一个‘安全属性’参数(其实是内核对象的安全描述符SD的一部分),虽然大部分应用程序都不关心这个参数,但是别小看他。安全描述符描述了谁是这个内核对象的创建者、哪些用户可以访问此对象,哪些不可以(几乎所有的内核对象创建函数都有‘安全属性’这个参数,这也是区分内核对象跟用户对象的一种方式)。

  最后说一下‘使用计数’,当内核对象创建的时候,实用计数是1,每增加一个引用,计数加一,到计数为零的时候,OS销毁此内核对象。


TAG: Windows编程相关

 

评分:0

我来说两句

Open Toolbar