windows nt file system internal 第九章中文

所需积分/C币:10 2012-07-30 15:25:37 1.34MB PDF
11
收藏 收藏
举报

windows nt file system internal第九章翻译,第一部分。 网上有1-6的中文部分,后面的没有放出来,这是我自己的翻译。第一次献丑,如有错误,请批评指正。
NT IO Manager 月 equests sen如加 e samp Reguests sent to the oca/ fire FSD b/ the 1O Manager sysrem by the vo Manager leF NTFSFAT File System driver directs disk o to deviee o to device drivers The sample file For buttered No drivers systerm wNW try the loca file buffered vo utilize the Disk requests using the Nr cache Nr Cache Disk ManagEr anager NT Cache Manager Fe Data for a specific file Data for a specific tieA cached by the nile_ A cached by the si把 system M? thhe rocar Mie system n the AT system cache NT system cache 图9-2简单文件系统实现架构的高层次视图 【后勤( Logistics】 实例代码会让你开始理解如何设计,开发一个商业的NT文件系统或者过滤器驱动。尽管没 有从方方面面完全实现,代码还是能作为·个框架被利用起来,使用这个框架,你能够创新 并且编制出你自己的商业的文件系统驱动。当你在阅读代码例子以及注释的时候,记住如下 的观点 一将关注点放在文件系统驱动与操作系统的交互上 对于一个商业的FSD( File System Driver)实现来说,有很多互相冲突的设计要做出选择。显 而易见的冲突有:更快,更干净,更抽象的还是相对较慢的设计。或者你得权衡是要更严格 的安仝还是用户使用起来更方便。如果增加并发性,就得增加更复杂的设计成本,也相对更 难维护和增强,或者选择比较少的并发操作,但是比较快的设计和实现,也更容易维护。 针对FDS设计者,木书实例代码不去列举各种可能的选择,仅仅为这些复杂的问题提供一份 单独的解决方案。因此,在阅读的时候,关注于学习与OS的交互上,如果有更多的开发问 题要了解,咨询本书列出的参考文献 所有的数据结构和函数名称以前缀SFsd开始 这个可以容易鉴別出来哪些函数和结构是简单文件系统驱动实现的。NT驱动编码规范要求 你应该为你的函数和数据结构体提供前缀名称 代码使用异常处理 夲书实现利用了结枃亿异常处理机制。如果你觉得提供这些机制是无用的,就无视它们吧。 我是强烈的鼓励你们使用这个了。 注释散布在实现中 有些人认为注释有用,有些人不这么认为。我写了大量的注释,散布在代码中。请阅读之, 这里有很重要的信息,有些在书中没有提及。 杏找替代实现方法 改计和实现内核模式驱动要求有一些工作经验,并且经常是一个迭代的过程。本书代码不应 该作为唯一的功能实现方式。如果你愿意思考,有大量的可替代方案,你也应该去搜索这些 替代方法。本书只是一个指导方针,但是要睁大眼睛去找其他的替代设计。 小心内存分配的问题 一一小心同步方面的问题 (原文太啰嗦,省略) 【注册表的交互】 文件系统要在注册衣中有·批键值 HKEY LOCAL_ MACHINE\ SYSTEMX\ CurrentControlSet\ Services\ Sample FSD 表9-1列出了代码要创建的子键及键值 踺/值 类型 描述 ErrorControl REG DWORD 0x1 如果加载失败,记 认错误,并且显小 个消息框,如果是自 动加载,继续初始化 p REG SZ File System 文什驱动组成员。如 果开发的是网络重定 向器,替换为 “ Network Provider” ImagePath REG EXPAND SZ %System 驱动镜像的完整路径 Root‰ System32\dr ivers\sfsd. sys Start REG DWORD 0x2或者0X3 0x02—自动启动 0×03—手动启动 Type REG DWORD 0x2 指示这是文件系统驱 动 Parameters 可配置参数。具体参 考表92 省咯 数据结构】 任何文件系统设计的核心,就是各种数据结构,它们联合起来定义了文作系统,包括在磁盘 上的和在内存中的。文件系统的数据存储在载体上(比如磁盘),包括两部分,部分是用 户产生的文件和目录,一部分是元数据,用来组织和维护用户数据。在磁盘上的数据结构, 泚是用来管理真正的用户存储的数据。而在内存中的数据结构,是帮助系统在运行时期,有 序的访问用户数据的数据结构。 将成功的设计出一个内核组件比作一场战役的话,理解这个内核组件或者驱动的数据结构, 那就算是打赢了这场战役的一半。 在完美的理想世界,oS是完全不需要∫解在磁盘上的数据结构,也不需要了解文件系统在 磁盘上的布局;同样地,也对在内存中的数据结构漠不关心,因为这些数据结构仅仅是为了 帮助实现文件系统特有的功能。NT不是·个完美的oS环境,在这方面,其他的任何商业可 用的OS,跟NT半斤八两差不多。然而,NT相对地对文件系统在磁盘上的数据结构不怎么 关心。虽然如此,如果文件系统不去维扩用户所期望的一些文件属性信息,比如最后写时间 ( last write time最后访问时间( last access time,或者一个文件的名字,就会让用户非常地迷惑, 用户会觉得这个文件系统非常的奇怪 Windows nt的原生文件系统,相比之前,有了不小的特性变化。 FASTFAT文件系统不提供安 仝特性(通常是作为访问控制列表(ACL, Access Control lists)来存储);不提供多重的文件 硬链接;也不提供系统错误后的快速恢复。然而,NTFS实现了这些功能。所以NTFS比FAT 文件系统来说,在憾盘上的数据结构极大的不同。(牢骚:罗里吧嗦,这些玩意儿说了一千 煸了,到现在还不说重点) 在磁盘上的数据结构和布局本书不予讨论,这个不需要遵从某些规沱。(啰嗦,废话,适当 无视) 我们感兴趣的数据结构,是在内存中呈现的数据结构。有两种数据结构读者必须非常熟悉 FCB:文件控制块, file control block CCB:上下文控制块, context control block [译者铺垫] 一个文件系统在磁盘上包括多种对象,文件,目录,卷,其他。一个文件静静的存储在磁盘 上,沉睡着,这个时候在系统运行的內存中没有任何数据结构管理它。一旦有进程期望将 个文件打开,那么OS和文件系统就要管理它了。每次个进程打开·个文件,会得到个 文件句柄,这代表了该文件的一次打开实例。所谓实例( nstance),做一个类比,比如盖印的 印章,关在盒子里,没有任何作用,每次在纸上盖出一个章,就可以说实例出了一个章了。 所以实例,就是真止产生出了一个实际出现的对象 一个文件可以被多个进程同时打开,每个打开的文件句柄,都是一个实例。每个实例,其各 自的状态不样,比如A进程,读文件,读到了第100个字节处,B进程读到129字节处, 这样,不同的进程对同一个文件就有不同的上下文,但是不管怎么说,这些进程打开的,都 是同一个文件,都是磁盘中存储的相冋数据。这两个概念,要分清楚,就是下文中要讲述的 两个结构。T啰嗦完毕] 个FCB,是一个在内存中的数据结构,唯一的代表了一个打开的(只有打开的时候,才由 FCB来管理)在磁盘上的对象。注意我说的是在磁盘上的对象,不仪仪是在磁盘上的文件 日录,文件,卷结构,以及其他的文件系统要维护的对象,而又能被文件系统的用户打开, 都被FCB所代表着。类比UNX的 vnode结构,抽象的代表了内存中的一个文件,两者都是 为了一个目的而被使用。 对一个在磁盘上对象的打开实例,文件系统创建并且维护了一个CCB,这代表一个简单的句 柄或者上下文。比如,当一个用户应用在一个文件上执行一个打开操作,成功的话,应用程 序会从oS的返回中得到一个句柄。与用户态句柄匹配,FSD创建一个cCB结构,是用户句 柄的等价物。是否必须有一个FCB唯一代表一个文件而CCB代表打开实例?我的回答是 肯定的。如果你觉得不·定,我建议你读完下面的章节再做判断。 【在内存中代表一个文件】 2有一些文件系统实现,包括NTFS, Fast Fat,用DCB来代表目录控制块。其实DCB和FCB没有任何区别 本书代码使用FCB代表这炳个对象。 你应该知道文件对象( file object,由1o管理器创建,用以代表对一个文件和日录的成功打 开。参考图9-3来了解文件对象,FCB,CCB,VCB如何关联在一起。 [牢骚和夹私:VCB为何物?作者没有解释。这个时候出小这张图,是不是早了点?太突然 了不? VCB,是卷控制块,和FCB差不多的意思。但是卷毕竞和文件,目录不样。每个卷都通过 一个vB唯一的管理。文件居住在卷上,所以FCB背定要和CB关联。CCB是文件的打开 实例,是一些动态变化的数据,文件静态的数据,FCB管理,所以CCB必须和FCB关联。文 件对象是1o管理器对文件,目录,设备的一次打开实例的内存代表,是打开之后的后续文 件操作,比如 readfile, writefile,的上下文数据的载体。 readfile可以从这个 FileObject中找 到打开时侯设置的状态信息,并在读的吋候更新状态信息,从而后续的操作可以继续得到这 个信息和状态。文件系统需要充分利用 File object中的字段来保留自己的状态信息—我自 己的理解,不一定对,结束 File object #1 File object #2 File object #3 Pointer to Pointer to Pointer to Device Object Device object Device Object Pointer to vPB Pointer to VPB Pointer to VPB FsContext1 FsContext1 Fscontextt fscontext2 Fscontext2 Fscontext2 SectionobjectPtrs SectionobjectPtrs SectionobjectPtrs s Private cacheD PrivateCache Map PrivatecacheMap CCB册1 CCB #2 CCB#3 NextccB NextccB NextccB PtrFGB PtrFCB PtrFCB PtrFileobject PtrFile abject FCB #1 FCB #2 CommonFCBHeader Common FCBHeader SectionObjeclPointers SectionoblectPointers Main Resource MainResource PagingIOResource PagingloResource NextcCB NextcCB PteDevice ect s PteDeviceObject VPB (for physical device object) volume Device Object Control e Device Object Block representing mounted logical volume representing physical disk (e.g. C 图9-3文件在内存中表征 为了更好的理解本图,我建议从图的底端开始看起。接下来就是对这个图中不同组件的描述 物理设备对象 图的最底端,有两个设备对象:物理设备对象和逻辑设各对象。物理设各对象般是媒体介 质型对象(译注:存储数据的介质,或者称为载体),其设备类型( Device type)可以是 FILE DEVICE DISK, FILE DEVICE VIRTUAL DISK, FILE DEVICE CD ROM,或者其他类似的类型。 这个结构一般由设备驱动创建,代表这个驱动管理的物理或者虚拟的磁盘对象,由设备驱动 程序调用函数 lo Create Device(来创建出来。 [夹私:一般来说,文件系统没备对象逻辑意义上处于存储系统改备对象之上。存储系统的 设备堆栈建立过程是这样的:总线驱动枚举总线上的物理设备,创建物理设备对象;然后调 用总线驱动之上的磁盘驱动,由磁盘驱动创建功能设备对象堆叠其上;磁盘枚举分区设备对 象;然后養管理器创建眷设备对象堆叠其上——这个过程很复杂,我省略了很多。大抵是这 个意思。 木图的物理设备对象就是存储系统的卷设备对象了。 当|O管理器创建设备对象的时候,发现设备类型是介质类型,就会分配一个VPB(卷参数 块)与设备对象关联( DEVICE OBJECT.Vpb)。最初,VPB的标志宇段指示,这个物理介质暂时 还没有逻辑卷在其上血挂载( mount起来(VBP_ MOUNTD)。不过随后,o管理器发起挂载动 作,就会有某个文件系统验证卷物理介质上的数据结构,如果是这个文件系统的格式,它就 会创建一个逻辑卷去挂载在这个物理介质对象上面。这里的逻辑卷设备对象,就是图中的逻 辑卷设备对象。 仔储系统驱动创建物理的介质型的卷设备对象,这个设备对象有个VPB字段(其他设各 对象也有这个宇段,但是不使用,只有介质型的设备对象才有用)。文件系统在挂载这个存 储系统驱动创建的卷设备对象的时候,创建一个逻辑的卷设备对象,挂载其上。就是通过 VPB关联起来的。VPB在存储系统创建的卷设备对象( FILE DEVICE DISK FILE)上面,文件系统 也创建设备对象,这个对象的类型是 FILE DEVICE D| SK FILE SYSTEM 关于VPB的分配和初始化,涉及到卷管理器驱动,文件系统驱动及O管理器,其过程也不 是一次性就初始化完毕。首先是存储系统的卷管理器驱动创建卷设备对象,通过调用Io管 理器的 locreate Device完成: NTSTATUS o CreateDevice( IN PDRIVER OBJECT Driverobject, IN ULONG Device Extension Size IN PUNICODE STRING DeviceName OPtIONAL IN DEVICE_ TYPE DeviceTyI IN ULONG DeviceCha racteristics IN BOOLEAN Exclusive OUT PDEVICE_ OBJECT *DeviceObject // If this device is either a tape or a disk, allocate a volume // Parameter Block(VPB )which indicates that the volume has // never been mounted, and set the device object's VPB pointer to //it if ((Device Type == FILE DEVICE DISK) I (Device Type = FILE_ DEVICE_TAPE)II (Device Type = FILE DEVICE CD ROM)II (Device Type = FILE DEVICE VIRTUAL DISK))t status lop Create Vpb(device Object); NTSTATUS CreateVpb( IN PDEVICE OBJECT Device object PVPB Vpb Vpb= EXAllocate PoolWithTag(Non Paged Pool, sizeof( VPB ) , ' bpV) RtlZeroMemory/vpb, sizeof(VPb)): Vpb->Type=I0 TYPE VPB Vpb->Si f( VPB Vpb->Real Device= Device object Deviceobject->Vpb=Vpb; return sTAtUs success typedef struct VPB t CSHORT Type CSHORT Siz USHORT Flags: JSHORT VolumeLabelLength; / in bytes struct_ DEVICE_ OBJECT* Device Object;∥/文件系统创建的卷设备对象,此对象就是被 文件系统 mount之后创建的设备对象 /由文件系统驱动在处理 mount请求的时候 设置 struct DEVICe OBJECT * RealDevice ∥/储系统创建的卷设备对象,文件系统 mount的日标。 ULONG SerialNumber ULONG ReferenceCount WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL _LENGTH sizeof(WcHar)]; J VPB, * PVPB 文件系统挂载一个存储系统的卷设备对象: NTSTATUS FatMountVolume( IN PIRP CONTEXT IrpContext, IN PDEVICE OBJECT TargetDevice Object N PVPB∨pb IN PDEVICE OBJECT FsDeviceObject // Now Before we can initialize the vcb we need to set up the device // object field in the vpb to point to our new volume device object // This is needed when we create the virtual volume file's file object // in initialize vcb Vpb->Device Object =(PDEVICE OBJECT)VolDo 逻缉卷改备对象 是挂载在物理卷设备对象之上的逻辑卷的实例。被文件系统驱动创建,本书实例也会创建卷 设备对象。 [磁盘是冇储数据的物理设备,可以想象成一个连续的存储载体,一般公分成几个区域,就 是所谓的分区。要存储用户数据,比如文件和目录,就要以某种格式來管理这些数据,这就 是不同的文件系统的数据格式。所以一个新的磁盘,一般要经历分区,然后对不同的分区进 行格式化的操作才可以使用。 卷在分区基础之上。分区是物理特性。卷是抽象的。个卷可以由个分区组成,也可以由 多个分区组成。比如RAD卷,就由多个分区来组成。文件系统挂载在卷之上。] 在大多数的操作系统上,用户要访问磁盘上的文件,必须是文件系统挂载了这个卷之后才可 以进行。[夹私:之所以可以挂载这个卷,那是因为之前进行格式化过,文件系统才能识别 出这个卷。FAT文件系统驱动,肯定无法识别出Ext2的文件系统格式,所以就无法挂载Ext2 柊式的卷。“Ext2格式的卷”的意思,首先,这个養还是存储系统概念上的卷。Ext2格式 是指这个卷上面的文件系统布局格式,是ext2的文件系统类型。其实如果仅仅站在存储系 统级别上来看这个卷,根木就不关心卷上的数据布局。而说到ext2,那一定是站在了文件系 统的级别来看卷里的数据布局了。] 为什么需要挂载操作?这是一个文件系统驱动创建逻辑卷设备对象并初始化这个卷设备对 象的好时机。然后文件系统的用户对这个卷就可以进行后续的访问 在挂载过程中,许多步骤都是文件系统所特有的,OS并不做过多的干涉。一般地,文件系 统驱动首先检査磁盘上的数据结构是否包含正确的文件系统格式信息。通过的话,文件系统 就要读出一些基本的卷信息,比如卷大小,根目汞的位置,空闲族map,已分配族map等 等,并且创建營理这个卷必须的在内存中的数据结构,后续对卷的访问也要用到它 在挂载逻辑卷的过程中,也冇操作系统确实冇要求的部分。比如系统规定的数据结构要戗创 建出来或者/并且初始化,将o管理器管理的数据结构,和文件系统管理逻辑卷的内存中的 数据结构建立起连接来。所以,文件系统驱动设计者必须珥解这些要求,了解这些数据结构 字段,如何初始化 只体到NT系统,10管理器要求如下:要创建出一个逻辑的卷设备对象,要正确的初始化介

...展开详情
试读 23P windows nt file system internal 第九章中文
立即下载 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
windows nt file system internal 第九章中文 10积分/C币 立即下载
1/23
windows nt file system internal 第九章中文第1页
windows nt file system internal 第九章中文第2页
windows nt file system internal 第九章中文第3页
windows nt file system internal 第九章中文第4页
windows nt file system internal 第九章中文第5页

试读结束, 可继续读2页

10积分/C币 立即下载