浅谈Windows 2000/XP File Cache实现(http://webcrazy.yeah.net)

片上眼图(Eye-opening monitor) 当它们值不同的时候error counter +1,通过统计RX到的码元个数、error counter,可以获得offset sampler上下左右不停的调整位置时的一个误码率(BER),通过这个误码率去描绘出眼图。如上图所示,eye-scan RX端 offset sampler独立且并行的和使用CDR sample的采样电路一起跑,offset-sampler可以任意调整水平(time)和垂直(voltage)方向的偏移(如下图所示),在一个UI内产生一个全新的sample点。 阅读详情
  浅谈Windows 2000/XP File Cache实现
              WebCrazy(http://webcrazy.yeah.net)

    声明:本文所叙内容为Windows NT/2000/XP的Cache管理内容,涉及内容均为Microsoft Undocumented内容。我在参考大量资料后分析而成,牵涉内容多多少少可能会有些许错误,甚至根本就是错误的,但本着学习交流的目的,权当是写下的笔记公布于此(http://webcrazy.yeah.net),希望能多加于交流(tsu00@263.net),以便我以后更新错误。

    记得早期dos下smartdrv.exe的功效就曾让我有较深的印象。我不记得我是在什么时候对这个小文件有兴趣且对其进行过学习的,这也是我对File Cache最初期的印象。在Windows NT/2000/XP中Cache管理部分更是让我有了现代操作系统实现File Cache的整体概念。读过《Inside Windows 2000》或是《Windows NT File System Internals》的肯定对此有比较深的理解,我不准备对他们已经涉及到的内容过于拘泥,我发现其实他们涉及到的许多东西并没有深入(虽然都有点出),或许也没有必要讲到具体实现上来,这会随着Windows的新版本的出现有些许改进变化。我得益于这两本书与其他许多资料,我也建议在往下看此文之前,首先好好的看一下他们。

    我们知道Cache部分最主要的是对文件(含网络远程文件)等较费时的IO操作作高速缓存(置入相对较快的内存中),既然其操作的对象主要是File(Windows中很多东西在底层均是作为File对象的),我们的叙述也已FILE对象开始。一个FILE对象,均有一个SECTION_OBJECT_POINTERS定义(详细的定义请参阅ntddk.h或ntifs.h中的FILE_OBJECT)。我在《探寻Windows NT/2000 Copy On Write机制》中指出过其定义:

     typedef struct _SECTION_OBJECT_POINTERS {
         PVOID DataSectionObject; //Control Area
         PVOID SharedCacheMap;
         PVOID ImageSectionObject; //Control Area
     } SECTION_OBJECT_POINTERS;

    因为成员DataSectionObject与ImageSectionObject均指向一称为Control Area的内部结构,而Control Area结构又指向一个称为Segment的内部结构。Segment由一个或多个原型PTE(Prototype PTE,PPTE)组成。PPTE是一个软件结构,我在《小议Windows NT/2000分页机制》结尾处提及过PPTE,也提及过PPTE不同于那边介绍的常规硬件PTE。PPTE的一个目的即是实现页面共享。而一个或多个PPTE(s)则组成了Subsection。这些基于kernel debug的ca命令的输出结果分析而成。

    成员SharedCacheMap则是真正的File Cache使用的结构。不同于FILE_OBJECT的另一个成员PrivateCacheMap,针对同一个文件,任何打开的指向这个文件的Handle指向的FILE_OBJECT结构的SharedCacheMap均是同一个值,这也是共享文件一个保证。我们来看在系统某一时刻同时指向shdocvw.dll的两个FILE_OBJECT(地址分别为80d37550与80db4860)的情况:

    //指向shdocvw.dll的第一个FILE_OBJECT:
    :fobj 80d37550
    DeviceObject * : 80EE2888
    Vpb * : 80EE2800
    FsContext * : E14D2D90
    FsContext2 * : E14D2EE8
    SecObjPointer * : 80DD15F4
    PrivateCacheMap * : 80EA70A0
        .
        .
        .
    FileName : /WINDOWS/system32/shdocvw.dll
        .
        .
        .

    //指向shdocvw.dll的第二个FILE_OBJECT:
    :fobj 80db4860
    DeviceObject * : 80EE2888
    Vpb * : 80EE2800
    FsContext * : E14D2D90
    FsContext2 * : E1183678
    SecObjPointer * : 80DD15F4
    PrivateCacheMap * : 80D6F2D8
        .
        .
        .
    FileName : /WINDOWS/system32/shdocvw.dll
        .
        .
        .

    从以上Softice的结果我们很容易的发现SECTION_OBJECT_POINTERS指向同一个内存区域,所以SharedCacheMap肯定指向同一个值,而PrivateCacheMap则是两个全然不同的值,进一步分析,FsContext也指向同一个值,而FsContext2则不同,实际上在实现FSD时,这两个成员一个为File Control Buffer(参阅ntifs.h中的FSRTL_COMMON_FCB_HEADER定义),一个指向Context Control Buffer,具体的用法可参考ntifs中的fastfat或是cdfs的实现,不在本文的讨论范围。

    分析过后FILE_OBJECT,我们可以得到一个结论:通过FILE_OBJECT我们可以得到这个FILE对象的一个或两个Control Area,而通过Control Area我们则可以得到Segment,既而即是Segment底下的Subsection与PPTEs,另外通过FILE_OBJECT我们也可以得到这文件所有实例的SharedCacheMap。事实上SharedCacheMap也有指针指向FILE_OBJECT,下面我会继续说明。

    记得我很早前就在《分析Windows NT/2000堆内存与虚拟内存组织》中定义过这样一个结构:

     typedef struct vad {
         void *StartingAddress;
         void *EndingAddress;
         struct vad *ParentLink;
         struct vad *LeftLink;
         struct vad *RightLink;
         ULONG Flags;
         ULONG MMCI;
         ULONG ProtoPTE;
     }VAD, *PVAD;

    实际上MMCI也即Control Area,我在《探寻Windows NT/2000 Copy On Write机制》中也作过解释。ProtoPTE即PPTE。

    有了这样一个概念以后,我们即可以很容易的发现PPTE是如何实现页面共享的。系统在初次访问PPTE所指向的页面时,由于PPTE的bit 0为无效,所以发生Page Fault,从而交由int e处理,即控制权由ntoskrnl.exe中的KiTrap0E交由MmAccessFault处理,然后通过查VAD,即可通过Control Area与PPTE定位PFN Database,读取在磁盘的内容,更新PTE实现共享的目的。

    详细的谈了FILE_OBJECT后,我们转向File Cache的讨论。Windows 2000/XP保留了由MmSystemCacheStart与MiSystemCacheStartExtra指向的两块系统虚拟内存区域专门用于System Cache。这专门的区域被分成大小为VACB_MAPPING_GRANULARITY(由ntifs.h中定义,值为0x40000,即256KB)的View。各View的使用情况由系统中的一个称为VACB的内部结构表示。这样系统中则有一个VACB数组,由CcVacbs指定。《Inside Windows 2000》中列举了VACB的四个成员,指出其包含一个重要的成员,即SharedCacheMap,下面是!dso命令的输出结果:

    kd> !dso VACB //Kernel Debug Extension Build 2167 Free
    Structure VACB - Size: 0x18
    000 BaseAddress 004 SharedCacheMap
    008 Overlay 010 LruList

    但通过分析,我发现Windows XP中VACB实际上由6个DWORD值组成,其第二个DWORD即SharedCacheMap。Windows XP使用6个DWORD,可能是其支持Larger Mapped Files的具体实现(FILE_OFFSET使用LARGE_INTEGER,虽然《Inside Windows 2000》中也指出过FileOffset成员,但不知为什么dso命令的输出结果没有显式的提供这样的一个成员,另我非常疑惑,难道又是版本间的差异吗?)。下面是XP底下的分析:

    kd> dd CcVacbs l 1
    80542fec 80ecc000
    kd> dd 80ecc000 //dd Vacb
    80ecc000 cb440000 80eaac78 00300000 00000000
    80ecc010 80eceda0 80ecf598 d4040000 80eaac78
    80ecc020 01000000 00000000 80ecd6a8 80ecede8
    80ecc030 c1100000 80eefed0 00000000 00000000
    80ecc040 80ece050 80542fe0 deb40000 ffa55538
    80ecc050 00000000 00000000 80ecd558 80ecc958

    kd> dd 80eaac78 l 12 //dd Vacb->SharedCacheMap
    80eaac78 013002ff 00000001 01a95400 00000000
    80eaac88 80eaac68 80eaaac0 01b00000 00000000
    80eaac98 ffffffff 7fffffff ffffffff 7fffffff
    80eaaca8 00000000 00000000 00000000 00000000
    80eaacb8 80eaa910 80ee2a80

    上面我曾提及SharedCacheMap也有指针指向FILE_OBJECT,我发现其位置在的第18个DWORD上,下面即Dump出FILE_OBJECT。
    kd> dd 80ee2a80 l 6 //dd FILE_OBJECT
    80ee2a80 00700005 80ee2888 80ee2800 80e7f9b0
    80ee2a90 00000000 80ee23a4

    FILE_OBJECT的定义已在ntddk.h中给出,所以很容易的得到其SECTION_OBJECT_POINTERS。
    kd> dd 80ee23a4 l 3 //dd FILE_OBJECT->SECTION_OBJECT_POINTERS
    80ee23a4 80e7f710 80eaac78 00000000
    kd> !ca 80e7f710 //!ca SECTION_OBJECT_POINTERS->DataSectionObject

    ControlArea @80e7f710
     Segment: e127a548 Flink 0 Blink 0
     Section Ref 1 Pfn Ref 275 Mapped Views 5f
     User Ref 0 WaitForDel 0 Flush Count 0
     File Object 80ee2a80 ModWriteCount 0 System Views 5f
     Flags (8088) NoModifiedWriting File WasPurged

     File: /$Mft
        .
        .
        .

    这样我们即dump出了CcVacbs指向的System Cache中的第一个VACB的内容,从ca命令的输出结果我们可以看出System Cache的第一个View由NTFS的元数据$Mft使用。Kernel Debug也提供一个叫filecache的命令,我在使用!filecache命令时曾查阅过其文档,文档中提及(WinDbg:6.0.00007.0):

    Each line of this extension's output represents a virtual address control block (VACB). When named files are mapped into the VACB, the names of these files are displayed. If "no name for file" is specified, this means that this VACB is being used to cache metadata.

    从上面的注释我还以为filecache命令通过遍历VACB数组,dump出所有Control Area,就像我上面的手工分析VACB过程一样。但实际上此命令输出的不仅仅只有这些内容。通过分析kdexts.dll中filecache的实现(Windows XP)中,发现其通过PsLoadedModuleList来实现dump filecache(具体内容需进一步学习)。

    最后还要指出的是系统通过CcIsFileCached宏来判断File是否被Cached。其在ntifs.h中定义,有了上面的分析后是非常容易理解的:

    #define CcIsFileCached(FO) ( /
     ((FO)->SectionObjectPointer != NULL) && /
     (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) /
    )

    本文未牵涉到另一个非常重要的数据结构PFN数据库,由MmPfnDatabase指定,PFN数据库中共享页面有PPTE的定义,实际上发生指向PPTE的页面的Page Fault后,查找完VAD后,系统会根据PFN数据库的PPTE完成下一步的工作。

    实际上关于Control Area、Subsection、PPTE、VACB、SharedCacheMap等的具体定义是我比较感兴趣的,而我目前为止仍对此只有些许概念。这也是我出此文的目的,也希望达到抛砖引玉的作用(tsu00@263.net)。
Cesium实战:如何在前端直接渲染TIFF影像(附完整代码与避坑指南) 本文详细介绍了如何在前端利用Cesium直接加载和渲染TIFF影像的完整技术方案。针对TIFF格式的地理影像数据,文章提供了从文件解析、坐标转换到像素处理与Cesium集成的全流程代码实现,并分享了性能优化与常见问题的避坑指南,帮助开发者高效实现三维地理可视化。 阅读详情

相关推荐

NT缓存管理器(四)

CcInitializeCacheMap 缓存管理器维护一个文件的cache map,以跟踪对文件执行的活动。第一个文件打开操作导致一个public cache map的生成。更多地,每个打开文件的实例同样有自己的一张cache map用来跟踪在其文件对象上执行的操作的信息。 一般地,cache map的生成被推迟直到第一个I/O发生。这保证了文件系统不能生成和删除cache map对一般的

Tommy(凌飞)的专栏 2446

跟着团子学SAP CO:结果分析各评估方法计算逻辑概览 RA Valuation Method Overview KKA1/KKA2/KKA3

在大部分企业财务月结时,结果分析是必不可少的一环,通过结果分析系统可按照设定的评估方法及相关配置自动计算在制品(WIP)、主营业务成本、主营业务收入等等。 在结果分析中最重要的是根据业务需求选择合适的评估方法,目前SAP共提供15种评估方法,今天针对每一种方法计算逻辑及常用的业务场景进行介绍: (1)基于收入的评估方式(带利润实现) Revenue-Based Method with Profit Realization 第一种方式的计算是基于实际收入与计划收入的占比推算应结转的主营业务成本,如果当期累计的

Lucas1211的博客 1万+

windows内核中Section/Segment/ControlArea/Subsection/MMVAD之间的关系

Section/Segment/ControlArea/Subsection/MMVAD之间的关系不知道能不能这么理解: Section是内存映射的管理结构,内含Segment。当文件的内容被映射到内存后,Segment中的原型pte是指向 已经被映射到内存中的文件页面。而ControlArea也是一个管理结构,其后的Subsection中有大量的原型pte 这些原型pte指向即将被映射

lixiangminghate的专栏 2191

(数字ic验证)从零开始的apb_watchdog验证模块搭建(一、功能介绍与环境搭建)

apb_watchdog验证模块搭建(一)文章目录 文章目录apb_watchdog验证模块搭建(一)文章目录前言一、apb_watchdog简单功能介绍二、测试平台环境搭建1.测试所用模板介绍2.tb与interface2.env与watchdog_pkg3.test与base_sequence4.Makefile总结——当前验证结构 前言 本文介绍了apb_watchdog验证模块的搭建过程与其具体代码,主要包括其中验证环境的构建,测试序列的发送与回归测试收集。主要运用systemvorilog与u

peop1e的博客 9737

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的另一种解决办法

昨天在关闭了中之后 就能正常打开 FDTD 了,结果今天想开启出现了同样的报错:我猜测昨天能启动的原因在于关闭之后要重启电脑,并且在重启之后我第一时间打开 lumerical 测试因此端口没有被占用,今天是在电脑启动之后一段时间才打开所以又遇到了端口占用的问题。

qq_51404184的博客 9549

Mini Filter 操作消息的分析

 Create : 1. 在 Create preoperation 的时候, FsContext, FsContext2 ,Vpb, SectionObjectPointer 都是 0 2. 在 Create PostOperation 的时候, FsContext, FsContext2, Vpb, SectionObjectPointer 都被初始化成相应的数值 3. 同

free2o的专栏 1873

苹果生态最佳搭档:Mac mini + OpenClaw + iPhone 远程控制

本文详细介绍如何通过iPhone远程控制Mac mini上的OpenClaw应用,打造高效苹果生态工作流。内容包括:1) 苹果生态整合优势,包括AirDrop、Handoff等功能对比;2) Mac mini配置步骤,涵盖SSH/VNC设置、网络优化及Docker部署OpenClaw;3) iPhone端SSH/VNC客户端选择与Tailscale内网穿透配置;4) 详细SSH密钥设置与连接测试方法。通过这套方案,用户可实现跨设备无缝控制OpenClaw应用,提升远程工作效率。(149字)

一键难忘的博客 793

windows内核情景分析 --- 文件系统

文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘、光盘、软盘、U盘等)。各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制。应用程序要访问存储在那些物理介质上的资料时,无需直接访问,只需借助文件系统即可对其有效访问。各种物理介质的存储方式千差万别,文件系统则按照‘文件’的概念,把要存储的资料以文件为单位进行存放,然后,读取的时候也

maomao171314的专栏 3925

HQChart实战教程49-点击修改K线颜色及背景色

HQChart实战教程49-点击修改K线颜色及背景色需求效果图步骤1. 注册点击监听事件2. 修改K颜色添加一个自定义颜色的K线klineoption清空所有自定义颜色的K线option交流QQ群: 950092318HQChart代码地址完整例子 需求 对点击的K线修改颜色。 效果图 步骤 1. 注册点击监听事件 事件ID JSCHART_EVENT_ID.ON_CLICK_CHART_PAINT, 注册监听事件见教程 HQChart使用教程5- K线图控件操作函数说明 this.Create=func

小银 2911

基于CNN-LSTM融合模型的环卫车动态称重算法研究:从频率感知到精准质量估计

摘要: 针对环卫车辆动态称重需求,本研究提出一种基于CNN-LSTM融合网络的频率分析方法。通过在实验室构建振动频率采集系统,获取不同载重下的结构响应数据,经MATLAB进行信号处理和特征提取后,建立频率-质量的非线性映射模型。实验表明,该算法在静态和模拟动态场景下平均绝对误差小于1.5%,显著优于传统方法,为环卫车智能化管理提供了高精度实时称重方案。 关键词: 动态称重;深度学习;频率分析;CNN-LSTM;MATLAB。

AI的内部世界的博客 374

Windows 的Cache管理器

Cache的四个接口 File Stream Manipulation Functions Copy Interface MDL Interface Pinning Interface 注意:Cache管理器的Pin接口和另外两个接口:Copy接口以及MDL接口不能 同时使用。 重要:Cache管理器并解释被缓存的数据内容,它只是理解File

Tommy(凌飞)的专栏 2553

基于STM32设计的遥控灭火消防小车_296

随着城市化进程的加速和火灾发生频率的增加,传统的消防方式在应对初期火灾时存在反应慢、效率低等问题。为了提高火灾响应速度和灭火效率,本设计开发了一款基于STM32单片机的遥控灭火消防小车。该小车配备了烟雾检测、温湿度监测、火源定位、灭火操作等功能,能够通过蓝牙和WIFI实现远程控制与实时视频传输。设计采用了MQ2烟雾传感器、SHT30温湿度传感器、火光传感器和ESP32摄像头模块等硬件设备。系统不仅能够自动检测和定位火源,还可以手动调整灭火器对准位置,进行干粉灭火。此外,蜂鸣器用于火源报警,确保操作人员及时得

722

文件过滤驱动学习笔记(三)

typedef struct _SECTION_OBJECT_POINTERS {  PVOID DataSectionObject;  PVOID SharedCacheMap;  PVOID ImageSectionObject; } SECTION_OBJECT_POINTERS,*PSECTION_OBJECT_POINTERS; DataSectionObject:   

lziog的专栏 1679

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

CacheMap缓存的多种方法

(一) Map<String,List<String>> cache = new ConcurrentHashMap<String, List<String>>(); cache.remove("str");cache.put("str",getCmsCfgAll()); List<String> name = cache.get(...

weixin_30782331的博客 2017

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ntifs.h

// ntifs.h// http://www.acc.umu.se/~bosse/ntifs.html/*This is a free version of the file ntifs.h, release 56.The purpose of this include file is to build file system andfile system filter drivers for

zzz3265的专栏 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

cacheMap缓存的使用

/**      * 获取缓存的对象      *       * @param account      * @return      */     public static String getCache(String account) {         account = getCacheKey(account);         // 如果缓存中有该账号,则返回value      ...

qq_34625907的博客 5498

windows内存管理2(做双缓存透明加密驱动必看)

这些东西我整理出来很久了,由于各种原因一直没放出来,引用的图来自网络或者书籍,如果你看的不错想要转载请注明本空间。 接上文: *文件缓存分析 一个典型文件创建缓存过程: 1.当文件对象第一次被缓存读写时,文件系统调用CcInitializeCacheMap初始化缓存 2.如果FileObject->SectionObjectPointer->SharedCacheMa

异次元小强 3811

文件系统缓存,filesystem cache

文件系统缓存 filesystem cache 许多人没有意识到。文件系统缓存对于性能的影响。Linux系统默认的设置倾向于把内存尽可能的用于文件cache,所以在一台大内存机器上,往往我们可能发现没有多少剩余内存。(free命令显示的第二行输出,如下)。文件系统cache可以加速磁盘操作,使系统有更好的IO性能,代价只是把一些空闲的内存利用起来了。 我们需要预留多少内存做文件系统cache...

洪文聊架构 1万+

过滤驱动加密文件(代码)

转载自http://www.misssir.cn/art/_show.aspx?art=49 摘要:     我想做一个unlocker一样的程序,不管这个文件有没有被使用,先实现删除它。在查资料过程中,就知道了如果不访问磁盘扇区的话,除非写驱动才能做到。奈何时间有限,工作匆忙,一直没有完成。而且忽视了更简便的方法——在别的路径下把修改后的OCX控件重新注册一下就可以了。    ...

weixin_33729196的博客 1049

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 176

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 672

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 374

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 271
上一篇: 浅析.NET Framework对PE文件格式的扩展(http://webcrazy.yeah.net)
下一篇: 探究Windows 2000/XP原型PTE(http://webcrazy.yeah.net)
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值