内核对象句柄表

转自:点击打开链接


一、什么是内核对象
       在Windows中,为了简化对资源的访问,统一采用HANDLE来表示各种各样的资源(如内存块、映射文件、Mutex、Semophore等等)在内存中的存放方式(一种数据结构),我们称之为对象。该数据结构中存放的是要访问的资源的相关信息,包括实际资源内容在内存中的地址、该数据结构(对象)引用计数以及安全属性等等。凡是在函数参数列表里中有安全属性选项时,这样的函数创建的对象就是内核对象。之所以称作内核对象,是因为这些对象有内核负责创建(分配内存),由内核负责对其操作。进程不可以直接访问这些对象,但是我们可以通过使用Windows提供的函数来安全地访问他们。
二、内核对象句柄表

         进程创建后,操作系统会为其生成一个内核对象句柄表,初始化为空。该句柄表只用来存放该进程生成的内核对象,其他的对象如User对象,GDI对象不存放在这个表中。确切的说,考虑到进程间共享内核对象,该内核对象句柄表可以存放其他进程的内核对象过的句柄值。一般,该表包含四列(老实说,由于没有相关的文档说明,到底是几列,我也不是太清楚)。不过有这四项就可以说明问题啦。

   

索引指向内核对象内存块的指针访问掩码标志
10xF00000000x???????0x0000000

        这时,你也许要问,为什么不直接使用一个指针来指向要读取的实际资源的内容,而是采用HANDLE来指向一个还不是实际资源的东东呢?哈哈,当初,我也疑惑啊。不过,如果你考虑到我们的系统使用的虚拟内存的技术后,难题就迎刃而解啦。虚拟内存最大的好处就是我们可以在有限的内存中尽可能运行更多的程序,如果是硬编址的话,那么某段时间内由于空闲而被换出的对象再次放入内存时可能位于不同的地址啦,所以指针指向的可能是其他应用程序的地址,严重的话会导致系统崩溃啊。这也是为什么采用HANDLE的原因。

 

接下来我们谈谈这四项的作用。

索引:我们说过使用HANDLE来实现对象的访问,它到底是如何做到的呢。前面说过,每一个内核对象都会在内核对象句柄表中占一行,(想一想,我们操作数据库时,为了查找学生的姓名,我们输入学生的ID就可以了,如果你对数据库了解的更多的话,就会知道为了方便查找,采用索引的机制,我们无需匹配所有的属性,只需匹配索引即可),内核对象句柄表同样如此。不过,这里可不是学生ID,而是HANDLE值(一般,HANDLE值的最后两位被系统占用,所以,HANDLE值一般为索引值的四倍(句柄值右移两位就可以得到内核对象的索引值【此处参看我转载的另一篇关于内核对象句柄表的文章点击打开链接】))。

指向内核对象内存块的指针:该地址是内核对象数据结构的地址,注意,我们给出的是确定的值,是因为该地址存在于内核区间,可以说几乎不可能改变(当然在进程还存在的时候啦),这与对象所代表的实际资源内存地址是不同的(两者位于的内存区域不同哦,一个内核区,一个用户区)。

访问掩码:一般表示进程是否有权限访问该句柄。

标志:该句柄是否可以被子进程继承。

 

关于内核对象的知识点很多,其中涉及到进程和线程的知识,大家得好好研读啊。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值