什么是内核对象

在这里插入图片描述
何为内核对象
作为 Windows软件开发人员,我们经常都要创建、打开和处理内核对象。系统会创建和处理几种类型的内核对象,比如访问令牌(access token)对象、事件对象、文件对象、文件映射对象、IO完成端口对象、作业对象、邮件槽(mailslot)对象、互斥量(mutex)对象、管道(pipe)对象、进程对象、信号量(semaphore)对象、线程对象、可等待的计时器(waitable timer)对象以及线程池工厂(thread pool worker factory)对象等。除了使用内核对象,应用程序可能还要使用其他类型的对象,比如菜单、窗口、鼠标光标、画刷和字体。这些属于用户对象或 GDIGraphical Device Interface)对象,而非内核对象。

使用计数
每个对象都包含一个使用计数(usage count)。使用计数是所有内核对象类型都有的一个数据成员。初次创建一个对象的时候,其使用计数被设为1。另一个进程获得对现有内核对象的访问后,使用计数就会递增。进程终止运行后,操作系统内核将自动递减此进程仍然打开的所有内核对象的使用计数。如果一旦对象的使用计数变成0,操作系统内核就会销毁该对象。

内核对象的安全性
内核对象可以用一个安全描述符(security descriptor,SD)来保护。安全描述符描述了谁(通常是对象的创建者)拥有对象;哪些用户和用户被允许访问或使用此对象;哪些组和用户被拒绝访问此对象。安全描述符通常在编写服务器应用程序的时候使用。用于创建内核对象的所有函数几乎都有指向一个 SECURITYATTRIBUTES结构的指针作为参数。

进程内核对象句柄表
一个进程在初始化时,系统将为它分配一个句柄表(handle table)这个句柄表仅供内核对象使用,不适用于用户对象或GDI对象。
在这里插入图片描述
创建一个内核对象
一个进程首次初始化的时候,其句柄表为空。当进程内的一个线程调用一个会创建内核对象的函数时(比如Create FileMapping),内核将为这个对象分配并初始化一个内存块。然后,内核扫描进程的句柄表,查找一个空白的记录项(empty entry)由于表3-1展示的是一个空白句柄表,所以内核在索引1位置找到空白的记录项,并对其进行初始化。

跨进程边界共享内核对象
在很多时候,不同进程中运行的线程需要共享内核对象。下面罗列了一些理由。
1. 利用文件映射对象,可以在同一台机器上运行的两个不同进程之间共享数据块。
2. 借助邮件槽和命名管道,在网络中的不同计算机上运行的进程可以相互发送数据块。
3. 互斥量、信号量和事件允许不同进程中的线程同步执行。例如,一个应用程序可能需要在完成某个任务之后,向另一个应用程序发出通知。

《Windows核心编程》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值