ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

【Windows内核原理与实现】读书笔记(四)

2019-08-20 12:43:58  阅读:328  来源: 互联网

标签:巢室 管理器 读书笔记 Windows 内核 HKLM 注册表 储巢 子键


原文链接:http://www.cnblogs.com/XjChenny/archive/2012/02/23/2364335.html

注册表和配置管理器

Windows操作系统提供了被称为“注册表”的中心存储设施作为系统的配置和管理中心,应用程序和内核通过访问注册表来读写各种设置。Windows提供了一些API供应用程序访问注册表,这些API函数在接到注册表访问请求之后,当它们转发给内核的系统服务。在内核中,执行体包含一个成为“配置管理器”的组件,它是注册表的真正实现。

注册表是一组成为储巢(hive)的文件构成的,每个储巢文件内部都包含了一个树状层次结构。Windows注册表是一个树状结构,每个节点是一个键(key)或值(value)。键是一个容器,可以包含其他的键(称为子键)和值。值存储的是数据。注册表的根是一个键,称为根键。

注册表的值可以有多种类型。绝大多数注册表值的类型为REG_DWORD、REG_BINARY、REG_SZ。有一种特殊的类型为REG_LINK,即符号链接,允许一个键或值指向另一个键或值。

真正存放系统设置信息的字数是HKLM(HKEY_LOCAL_MACHINE)和HKU(KHEY_USERS)。HKLM存放着有关系统全局的信息,包括5个子键,分别为HARDWARE(硬件设置)、SAM(本地账户和组的信息)、SECURITY(系统全局范围的安全策略和用户权限设置)、SOFTWARE(系统中的全局配置信息,包括设备驱动程序和系统服务等)。HKU位系统中每个加载过的用户轮廓包含了一个子键,也包含了一个名为.DEFAULT的子键,这是系统的默认轮廓。

一个系统的储巢列表存放在KHLM\SYSTEM\CurrentControlSet\Control\hivelist键下。当系统初始化时,HKLM\SYSTEM总是呗先加载进来,然后配置管理器找到hivelist键,继而加载其他储巢,并创建注册表根键,将这些储巢链接起来,从而建立起完整的注册表结构。

储巢的基本分配单元称为块(block),当储巢为了存储新的数据而需要扩展时,它总是按照块的粒度来增长。在Windows中,注册表的块大小为4KB。储巢的第一个块称为基本块,它包含了储巢文件标识、最新序列号、最后一次写操作的时间戳、储巢格式的版本号、校验和以及储巢的内部文件名。

储巢中的注册表数据是按照巢室(cell)来组织的。每个巢室可以存放一个键、值、安全描述符、子键列表或者值列表,对应的巢室分别称为键巢室、值巢室、安全描述符巢室、子键列表巢室和值列表巢室。巢室在储巢文件中的偏移称为该巢室的索引(cell index),其他巢室可以利用此巢室索引来引用它,从而建立起巢室之间的关系。

巢室的大小不是固定的,配置管理器根据需要从巢室中申请特定大小的存储空间作为一个巢室。如果配置管理器必须要扩展已有的储巢文件才能分配一个新的巢室,那么它会申请一个称为巢箱(bin)的存储单元。巢箱总是以块为边界。当为一个巢室而扩展储巢文件时,实际申请的存储空间要扩展到下一个块边界。巢箱中未被使用的空间被当做空闲空间管理起来,从而可以再分配给其他巢室。当巢室被删除时,它们的空间会被回收,如果有可能,相邻的空闲空间被合并成更大的空闲空间。储巢文件本质上是越长越大,要想压缩整个储巢文件中的空闲巢箱,只有在原来出招的基础上重构一个新的储巢文件(通过RegSaveKey函数),然后替换成或恢复该储巢所在的键(通过RegReplaceKey或RegRestoreKey函数)。

在Windows XP/Server 2003中,配置管理器利用缓存管理器来映射储巢文件中的数据,它可以有选择的映射所需要的那部分数据,并且也能够接触不再需要访问的数据或者长久不访问的数据,以避免储巢文件占据太多的系统缓存空间。

  • 配置管理器和注册表的初始化过程

  1. 内核初始化阶段,建立起HKLM\SYSTEM和HKLM\HARDWARE储巢
  2. 由会话管理器(smass.exe进程)建立起HKLM\SAM、HKLM\SECURITY、HKLM\SOFTWARE和HKU\DEFAULT储巢
  3. 当加载用户轮廓时建立起HKU\<用户的SID>储巢,这是由登陆进程winlogon.exe来完成的。

配置管理器充分利用了对象管理器提供的对象管理框架,让注册表中的每个键自动成为对象管理器中的一个对象。对于每个打开的注册表键,配置管理器分配一个键控制块(key control block),其数据结构为CM_KEY_CONTROL_BLOCK,它包含了该控制块所引用的键节点所在的储巢和巢室索引。配置管理器将所有的键控制块放在一张散列表(全局变量CmpCacheTable)中,因而可以快速地根据名称来搜索已有的键控制块。散列表CmpCacheTable实际上是一个包含了2048个元素的数组,散列表的键ID是由键控制块所引用的键对象的名称通过计算而获得。

转载于:https://www.cnblogs.com/XjChenny/archive/2012/02/23/2364335.html

标签:巢室,管理器,读书笔记,Windows,内核,HKLM,注册表,储巢,子键
来源: https://blog.csdn.net/weixin_30443895/article/details/99833963

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有