{"id":590,"date":"2011-08-03T19:03:13","date_gmt":"2011-08-03T11:03:13","guid":{"rendered":"http:\/\/blog.dynox.cn\/?p=590"},"modified":"2011-08-08T08:47:23","modified_gmt":"2011-08-08T00:47:23","slug":"%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e5%bc%80%e5%8f%91%e4%b9%8b%e6%b3%a8%e5%86%8c%e7%af%87","status":"publish","type":"post","link":"https:\/\/blog.dynox.cn\/?p=590","title":{"rendered":"\u6587\u4ef6\u7cfb\u7edf\u5f00\u53d1\u4e4b\u6ce8\u518c\u7bc7"},"content":{"rendered":"<div class=\"gruber-markdown\"><p>\u6587\u4ef6\u7cfb\u7edf\u662f\u4e00\u7c7b\u7279\u6b8a\u7684\u5185\u6838\u9a71\u52a8\uff0c\u4e3b\u8981\u8d1f\u8d23\u6570\u636e\u6d41\uff08\u5373\u6587\u4ef6\uff09\u7684\u7ba1\u7406\u3002\u7528\u6237\u7684\u89c6\u56fe\u6240\u663e\u793a\u51fa\u7684\u662f\u5404\u8272\u5404\u6837\u7684\u6587\u4ef6\u548c\u76ee\u5f55\uff0c\u4f46\u6700\u5e95\u5c42\u7684\u5b58\u50a8\u8bbe\u5907\u5219\u662f\u4ee5\u6247\u533a\u4e3a\u5355\u4f4d\u7684\u8fde\u7eed\u7684\u5b58\u50a8\u5b9e\u4f53\uff08\u5982\u786c\u76d8\uff0c\u5149\u76d8\u7b49\uff09\uff0c\u6587\u4ef6\u7cfb\u7edf\u4fbf\u5904\u4e8e\u4e8c\u8005\u4e2d\u95f4\uff0c\u8d1f\u8d23\u7ba1\u7406\u6587\u4ef6\/\u76ee\u5f55\u5728\u8bbe\u5907\u5b58\u50a8\u4e2d\u7684\u89e3\u6790\u4e0e\u5b9a\u4f4d\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u5c06\u6587\u4ef6\u7cfb\u7edf\u770b\u4f5c\u662f\u4e00\u4e2a\u8f6c\u6362\u673a\u3002<\/p>  <p>\u4e0d\u540c\u7c7b\u578b\u7684\u9a71\u52a8\u90fd\u6709\u4e0d\u540c\u7684\u529f\u80fd\u5b9e\u73b0\uff0c\u5e76\u4e14\u5728\u9a71\u52a8\u52a0\u8f7d\u65f6\u90fd\u8981\u5411\u64cd\u4f5c\u7cfb\u7edf\u6ce8\u518c\uff0c\u62a5\u544a\u5b83\u662f\u4e2a\u4ec0\u4e48\u7c7b\u578b\u7684\u9a71\u52a8\u53ca\u8981\u7ba1\u7406\u4ec0\u4e48\u6837\u7684\u8bbe\u5907\u7b49\u7b49\u3002\u5c31\u5982\u4e00\u4e2a\u7535\u996d\u7172\u9a71\u52a8\uff0c\u8981\u5b9e\u73b0\u7684\u529f\u80fd\u5927\u81f4\u6709\u5f00\u5173\u7535\u6e90\uff0c\u6e29\u63a7\u53ca\u5b9a\u65f6\u7b49\u529f\u80fd\uff0c\u52a0\u8f7d\u65f6\u53ef\u4ee5\u5411\u7cfb\u7edf\u6ce8\u518c\u4e3a\u70f9\u8c03\u7c7b\u8bbe\u5907\u7684\u9a71\u52a8\u3002\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u4e5f\u5927\u81f4\u5982\u6b64\uff0c\u53ea\u662f\u529f\u80fd\u66f4\u590d\u6742\uff0c\u4e0e\u5185\u6838\u7684\u5173\u7cfb\u4e5f\u66f4\u7d27\u5bc6\uff0c\u7279\u522b\u662f\u548cVirtual Memory, Cache Management\u53caI\/O Subsystem\u7684\u5173\u7cfb\u548c\u4ea4\u4e92\u3002<\/p>  <p>\u4e0d\u540c\u7684\u64cd\u4f5c\u7cfb\u7edf\u5bf9\u6587\u4ef6\u7cfb\u7edf\u7684\u529f\u80fd\u5b9e\u73b0\u6709\u4e0d\u540c\u7684\u89c4\u8303\u548c\u8981\u6c42\uff0c\u4f46\u4ece\u6700\u57fa\u672c\u7684\u9700\u6c42\u51fa\u53d1\uff0c\u5404\u79cd\u6587\u4ef6\u7cfb\u7edf\u7684\u529f\u80fd\u5927\u81f4\u4e00\u6837\uff0c\u53ea\u662f\u7cfb\u7edf\u7684\u63a5\u53e3\u4e0d\u540c\u800c\u5df2\u3002\u8fd9\u91cc\u53ea\u4ecb\u7ecdWindows\u548cLinux\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u6587\u4ef6\u7cfb\u7edf\u7684\u5f00\u53d1\u3002Windows\u5e73\u53f0\u4e0a\u79f0\u4e4b\u4e3aIFS (Installable File System)\uff0cLinux\u7cfb\u7edf\u5219\u4e3aVFS(Virtual Filesystem\uff0c\u4e5f\u53ef\u89e3\u91ca\u4e3aVirtual Filesystem Switch)\u3002<\/p>  <p>\u6b64\u7bc7\u6587\u7ae0\u53ea\u7740\u91cd\u4e8e\u6587\u4ef6\u7cfb\u7edf\u7684\u6ce8\u518c\u8fc7\u7a0b\uff0c\u81f3\u4e8e\u5377\u7684\u6302\u8f7d(Mount)\u64cd\u4f5c\u5c06\u5728\u4ee5\u540e\u7684\u6587\u7ae0\u4e2d\u518d\u4f5c\u8bb2\u8ff0\u3002<\/p>  <p>&#160;<\/p>  <h3>Windows\u5e73\u53f0\u4e0a\u7684\u6587\u4ef6\u7cfb\u7edf\u6ce8\u518c\u8fc7\u7a0b\uff1a<\/h3>  <p>Windows\u5185\u6838(I\/O Manager)\u63d0\u4f9b\u4e86\u4e00\u7ec4\u5185\u6838\u652f\u6301\u7a0b\u5e8f(kernel support routine)\u6765\u5b8c\u6210\u6587\u4ef6\u7cfb\u7edf\u7684\u6ce8\u518c\u548c\u79fb\u9664\u3002<\/p>  <p><font face=\"Arial\">VOID      <br \/>&#160; IoRegisterFileSystem(       <br \/>&#160;&#160;&#160; IN OUT PDEVICE_OBJECT&#160; DeviceObject&#160;&#160; \/* Deviect object representitive of file system*\/       <br \/>&#160;&#160;&#160; );<\/font><\/p>  <p><font face=\"Arial\">VOID      <br \/>&#160; IoUnregisterFileSystem(       <br \/>&#160;&#160;&#160; IN OUT PDEVICE_OBJECT&#160; DeviceObject&#160; \/* Deviect object representitive of file system*\/       <br \/>&#160;&#160;&#160; );<\/font><\/p>  <p>\u6ce8\u518c\u8c03\u7528\u5f88\u7b80\u5355\uff0c\u4ee5Ext2Fsd\u4e3a\u4f8b\uff0cExt2Fsd\u9488\u5bf9\u5149\u76d8\u4ecb\u8d28\u548c\u78c1\u76d8\u4ecb\u8d28\u7684\u8bbe\u5907\u5206\u522b\u521b\u5efaCdromdevObject\u53caDiskdevobject\uff0c\u7136\u540e\u5206\u522b\u6ce8\u518c\u3002<\/p>  <p><font face=\"Arial\">NTSTATUS      <br \/><strong>DriverEntry<\/strong> (       <br \/>&#160;&#160;&#160; IN PDRIVER_OBJECT&#160;&#160; DriverObject,       <br \/>&#160;&#160;&#160; IN PUNICODE_STRING&#160; RegistryPath       <br \/>)       <br \/>{       <br \/>&#160;<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; PDEVICE_OBJECT&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DiskdevObject = NULL;      <br \/>&#160;&#160;&#160; PDEVICE_OBJECT&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CdromdevObject = NULL;<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; ......<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; \/* create Ext2Fsd cdrom fs deivce *\/      <br \/>&#160;&#160;&#160; RtlInitUnicodeString(&amp;DeviceName, CDROM_NAME);&#160; <br \/>&#160;&#160;&#160; Status = <strong>IoCreateDevice<\/strong>(&#160; DriverObject,&#160; 0,&#160; DeviceName,       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <\/font><font face=\"Arial\"><strong>FILE_DEVICE_CD_ROM_FILE_SYSTEM,        <br \/><\/strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0,&#160; FALSE,&#160; <strong>&amp;CdromdevObject <\/strong>);<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; if (!NT_SUCCESS(Status)) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; DEBUG(DL_ERR, ( &quot;IoCreateDevice cdrom device object error.\\n&quot;));       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; goto errorout;       <br \/>&#160;&#160;&#160; }<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; \/* create Ext2Fsd disk fs deivce *\/      <br \/>&#160;&#160;&#160; RtlInitUnicodeString(&amp;DeviceName, DEVICE_NAME);       <br \/>&#160;&#160;&#160; Status = <strong>IoCreateDevice<\/strong>(&#160; DriverObject,&#160; 0, &amp;DeviceName,&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>FILE_DEVICE_DISK_FILE_SYSTEM<\/strong>,&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0,&#160; FALSE,&#160; &amp;<strong>DiskdevObject <\/strong>);<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; if (!NT_SUCCESS(Status)) {      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; DEBUG(DL_ERR, ( &quot;IoCreateDevice disk deviceobject error.\\n&quot;));       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; goto errorout;       <br \/>&#160;&#160;&#160; }<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; ......<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; \/* register file system devices for disk and cdrom *\/      <br \/>&#160;&#160;&#160; <\/font><font face=\"Arial\"><strong>IoRegisterFileSystem(DiskdevObject);&#160; <br \/><\/strong>&#160;&#160;&#160; ObReferenceObject(DiskdevObject);<\/font><\/p>  <p><font face=\"Arial\"><strong>&#160;&#160;&#160; IoRegisterFileSystem(CdromdevObject); <\/strong>      <br \/>&#160;&#160;&#160; ObReferenceObject(CdromdevObject);<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; ......<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; return status;      <br \/>}<\/font><\/p>  <p>\u4f60\u6216\u8bb8\u4f1a\u8ff7\u60d1\u4e3a\u4ec0\u4e48Ext2Fsd\u4f1a\u6ce8\u518c\u4e24\u6b21\uff08\u9488\u5bf9cdrom\u8bbe\u5907\u548cdisk\u8bbe\u5907\uff09\uff1f\u4e0b\u9762\u6211\u4eec\u5c31\u6765\u63a2\u8ba8IoRegisterFileSystem\u7684\u5185\u90e8\u5b9e\u73b0\u3002<\/p>  <p>Windows I\/O Manager \u7ba1\u7406\u77404\u4e2a\u961f\u5217\uff1a\u6bcf\u4e2a\u961f\u5217\u90fd\u7ba1\u7406\u4e0d\u540c\u7c7b\u522b\u7684\u6240\u6709\u6587\u4ef6\u7cfb\u7edf\uff1a<\/p>  <p><font face=\"Arial\">\u4ee5Windows 7 X64\u4e3a\u4f8b\uff1a<\/font><\/p>  <p><font face=\"Arial\">0: kd&gt; x nt!iop*FileSystemQueueHead     <br \/>fffff800`04076200 nt!IopCdRomFileSystemQueueHead = &lt;no type information&gt;      <br \/>fffff800`04076210 nt!IopDiskFileSystemQueueHead = &lt;no type information&gt;      <br \/>fffff800`040761e0 nt!IopTapeFileSystemQueueHead = &lt;no type information&gt;      <br \/>fffff800`040761f0 nt!IopNetworkFileSystemQueueHead = &lt;no type information&gt;<\/font><\/p>  <p>\u901a\u8fc7\u540d\u5b57\u5c31\u80fd\u770b\u51fa\u6bcf\u4e2a\u961f\u5217\u6240\u7ba1\u7406\u7684\u6587\u4ef6\u7cfb\u7edf\u7684\u7c7b\u578b\uff0c\u6240\u4ee5\u5f53I\/O Manager\u65b0\u53d1\u73b0\u67d0\u4e00\u7c7b\u578b\u5b58\u50a8\u8bbe\u5907\u65f6\uff0c\u5c31\u53ea\u4ece\u76f8\u5e94\u7684\u961f\u5217\u4e2d\u4f9d\u6b21\u8c03\u7528\u961f\u5217\u4e0a\u7684\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u6765\u8bc6\u522b\u5b58\u50a8\u8bbe\u5907\u4e0a\u7684\u6587\u4ef6\u5377\uff0c\u800c\u4e0d\u662f\u8c03\u7528\u6ce8\u518c\u4e8e\u7cfb\u7edf\u4e2d\u7684\u6240\u6709\u6587\u4ef6\u7cfb\u7edf\u3002<\/p>  <p>Ext2Fsd\u9664\u4e86\u652f\u6301\u78c1\u76d8\u4ecb\u8d28\u8bbe\u5907\u5916\uff0c\u8fd8\u53ef\u4ee5\u652f\u6301\u5149\u76d8\u8bbe\u5907\uff0c\u6240\u4ee5\u8981\u9488\u5bf9\u4e0d\u540c\u7684\u50a8\u5b58\u8bbe\u5907\u7c7b\u578b\u5206\u522b\u6ce8\u518c\u3002<\/p>  <p>\u5728Windbg\u4e2d\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5730\u7f57\u5217\u51fa\u6240\u6709\u6302\u8f7d\u7684\u6587\u4ef6\u7cfb\u7edf\uff0c\u4ee5IopDiskFileSystemQueueHead\u4e3a\u4f8b\uff1a<\/p>  <p><font face=\"Arial\">0: kd&gt; !list &quot;-t nt!_LIST_ENTRY.Flink -e -x \\&quot;dd @$extret l4;&#160; !devobj @$extret-0x50\\&quot; poi(<strong>nt!IopDiskFileSystemQueueHead<\/strong>)&quot;      <br \/>dd @$extret l4;&#160; !devobj @$extret-0x50       <br \/>fffffa80`04839450&#160; 044e3d50 fffffa80 04076210 fffff800      <br \/>Device object (fffffa8004839400) is for:      <br \/>&#160;<strong>Ext2Fsd \\FileSystem\\Ext2Fsd DriverObject fffffa800482d210       <br \/><\/strong>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt 00000000 DevObjExt fffffa8004839550       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>AttachedDevice (Upper) fffffa8004843040 \\FileSystem\\FltMgr      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`044e3d50&#160; 044e22b0 fffffa80 04839450 fffffa80      <br \/>Device object (fffffa80044e3d00) is for:      <br \/><strong> ExFatRecognizer \\FileSystem\\Fs_Rec DriverObject fffffa80044e2060<\/strong>      <br \/>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt fffffa80044e3e50 DevObjExt fffffa80044e3e60       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`044e22b0&#160; 044e24e0 fffffa80 044e3d50 fffffa80      <br \/>Device object (fffffa80044e2260) is for:      <br \/><strong> FatDiskRecognizer \\FileSystem\\Fs_Rec DriverObject fffffa80044e2060<\/strong>      <br \/>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt fffffa80044e23b0 DevObjExt fffffa80044e23c0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`044e24e0&#160; 0448d7f0 fffffa80 044e22b0 fffffa80      <br \/>Device object (fffffa80044e2490) is for:      <br \/><strong> UdfsDiskRecognizer \\FileSystem\\Fs_Rec DriverObject fffffa80044e2060<\/strong>      <br \/>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt fffffa80044e25e0 DevObjExt fffffa80044e25f0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`0448d7f0&#160; 036660b0 fffffa80 044e24e0 fffffa80      <br \/>Device object (fffffa800448d7a0) is for:      <br \/><strong> Ntfs \\FileSystem\\Ntfs DriverObject fffffa800448d9c0<\/strong>      <br \/>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt 00000000 DevObjExt fffffa800448d8f0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>AttachedDevice (Upper) fffffa80044d2040 \\FileSystem\\FltMgr      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`036660b0&#160; 04076210 fffff800 0448d7f0 fffffa80      <br \/>Device object (fffffa8003666060) is for:      <br \/><strong> RawDisk \\FileSystem\\RAW DriverObject fffffa8003667770<\/strong>      <br \/>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000050      <br \/>Dacl fffff9a100324650 DevExt 00000000 DevObjExt fffffa80036661b0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>AttachedDevice (Upper) fffffa800371b860 \\FileSystem\\FltMgr      <br \/>Device queue is not busy.<\/font><\/p>  <p>\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u665a\u6ce8\u518c\u7684\u6587\u4ef6\u7cfb\u7edfExt2Fsd\u5219\u88ab\u653e\u5728\u4e86\u53cc\u5411\u94fe\u8868\u7684\u94fe\u9996\u4f4d\u7f6e\uff0c\u5373\u7b2c\u4e00\u4e2a\uff1b\u6700\u65e9\u6ce8\u518c\u7684Ntfs\u5219\u662f\u5728\u94fe\u5c3e\u3002\u4e0d\u8fc7\u6709\u79cd\u4f8b\u5916\uff0c\u5982\u679c\u8bbe\u5907\u88ab\u6307\u5b9aDO_LOW_PRIORITY_FILESYSTEM\u6807\u5fd7\uff0cIoRegisterFileSystem\u4f1a\u5c06\u6b64\u6587\u4ef6\u7cfb\u7edf\u6302\u8f7d\u81f3\u94fe\u8868\u5c3e\u90e8\u3002<\/p>  <p>\u5728Ntfs\u53caExt2Fsd\u4e4b\u95f4\uff0c\u8fd8\u6709Windows\u7cfb\u7edf\u672c\u8eab\u63d0\u4f9b\u76843\u4e2aFile system recognizer\uff0c\u5747\u5728\u6a21\u5757Fs_Rec\uff08\u5373 fs_rec.sys\uff09\u4e2d\u5b9e\u73b0\u3002Recognizer\u662f\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u4e2d\u6bd4\u8f83\u7279\u6b8a\u7684\u4e00\u7c7b\uff0c\u5b83\u7684\u529f\u80fd\u5f88\u7b80\u5355\uff1a\u5982\u679c\u53d1\u73b0\u6709\u5b83\u80fd\u8bc6\u522b\u7684\u5377\u8bbe\u5907\uff0c\u5b83\u5219\u4f1a\u52a0\u8f7d\u76f8\u5e94\u7684\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u6765\u6302\u8f7d\u6b64\u5377\u5e76\u5378\u8f7d\u81ea\u5df1\u3002Recognizer\u4e4b\u6240\u4ee5\u5b58\u5728\u7684\u552f\u4e00\u76ee\u7684\u5c31\u662f\u8282\u7701\u5185\u5b58\u8d44\u6e90\u3002Recognizer\u9a71\u52a8\u76f8\u6bd4\u5176\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\uff0c\u4ee3\u7801\u91cf\u8981\u5c0f\u5f97\u591a\uff0c\u6bd4\u5982\uff0c\u96c6\u591a\u4e2aRecognizer\u4e0e\u4e00\u8eab\u7684fs_rec.sys\u6a21\u5757\u53ea\u670916K\uff0c\u800cexfat\u53cafastfat\u9a71\u52a8\u5728100K-200K\u4e4b\u95f4\uff0cNtfs\u66f4\u67091.5M\u4e4b\u5927\u3002\u5982\u679c\u76f4\u63a5\u52a0\u8f7d\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\uff0c\u800c\u5b9e\u9645\u7cfb\u7edf\u4e2d\u53c8\u6ca1\u6709\u6b64\u6587\u4ef6\u7cfb\u7edf\u6240\u7ba1\u7406\u7684\u50a8\u5b58\u8bbe\u5907\u7684\u8bdd\uff0c\u90a3\u9a71\u52a8\u7a0b\u5e8f\u6240\u5360\u7528\u7684\u5185\u5b58\u5c31\u5b8c\u5168\u662f\u8d44\u6e90\u7684\u6d6a\u5e9f\u3002<\/p>  <p>\u4e0b\u9762\u505a\u4e2a\u5b9e\u9a8c\uff0c\u63d2\u5165\u4e00\u4e2aFAT32\u683c\u5f0f\u7684SD\u5361\u540e\uff0c\u518d\u6765\u89c2\u5bdf\u4e00\u4e0bIopDiskFileSystemQueueHead\u94fe\u7684\u53d8\u5316\uff1a<\/p>  <p><font face=\"Arial\">0: kd&gt; !list &quot;-t nt!_LIST_ENTRY.Flink -e -x \\&quot;dd @$extret l4;&#160; !devobj @$extret-0x50\\&quot; poi(<strong>nt!IopDiskFileSystemQueueHead<\/strong>)&quot;      <br \/>dd @$extret l4;&#160; !devobj @$extret-0x50       <br \/>fffffa80`048428d0&#160; 04839450 fffffa80 04076210 fffff800      <br \/>Device object (fffffa8004842880) is for:      <br \/><strong><u> Fat \\FileSystem\\fastfat DriverObject fffffa8005809e70<\/u><\/strong>      <br \/>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt 00000000 DevObjExt fffffa80048429d0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>AttachedDevice (Upper) fffffa80047a6870 \\FileSystem\\FltMgr      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`04839450&#160; 044e3d50 fffffa80 048428d0 fffffa80      <br \/>Device object (fffffa8004839400) is for:      <br \/>&#160;<strong>Ext2Fsd \\FileSystem\\Ext2Fsd DriverObject fffffa800482d210       <br \/><\/strong>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt 00000000 DevObjExt fffffa8004839550       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>AttachedDevice (Upper) fffffa8004843040 \\FileSystem\\FltMgr      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`044e3d50&#160; 044e24e0 fffffa80 04839450 fffffa80      <br \/>Device object (fffffa80044e3d00) is for:      <br \/>&#160;<strong>ExFatRecognizer \\FileSystem\\Fs_Rec DriverObject fffffa80044e2060       <br \/><\/strong>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt fffffa80044e3e50 DevObjExt fffffa80044e3e60       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`044e24e0&#160; 0448d7f0 fffffa80 044e3d50 fffffa80      <br \/>Device object (fffffa80044e2490) is for:      <br \/>&#160;<strong>UdfsDiskRecognizer \\FileSystem\\Fs_Rec DriverObject fffffa80044e2060       <br \/><\/strong>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt fffffa80044e25e0 DevObjExt fffffa80044e25f0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`0448d7f0&#160; 036660b0 fffffa80 044e24e0 fffffa80      <br \/>Device object (fffffa800448d7a0) is for:      <br \/>&#160;<strong>Ntfs \\FileSystem\\Ntfs DriverObject fffffa800448d9c0       <br \/><\/strong>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000040      <br \/>Dacl fffff9a100324650 DevExt 00000000 DevObjExt fffffa800448d8f0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>AttachedDevice (Upper) fffffa80044d2040 \\FileSystem\\FltMgr      <br \/>Device queue is not busy.<\/font><\/p>  <p><font face=\"Arial\">dd @$extret l4;&#160; !devobj @$extret-0x50      <br \/>fffffa80`036660b0&#160; 04076210 fffff800 0448d7f0 fffffa80      <br \/>Device object (fffffa8003666060) is for:      <br \/>&#160;<strong>RawDisk \\FileSystem\\RAW DriverObject fffffa8003667770       <br \/><\/strong>Current Irp 00000000 RefCount 1 Type 00000008 Flags 00000050      <br \/>Dacl fffff9a100324650 DevExt 00000000 DevObjExt fffffa80036661b0       <br \/>ExtensionFlags (0x00000800)&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unknown flags 0x00000800      <br \/>AttachedDevice (Upper) fffffa800371b860 \\FileSystem\\FltMgr      <br \/>Device queue is not busy.<\/font><\/p>  <p>FatDiskRecognizer\u53d1\u73b0FAT32\u683c\u5f0f\u7684\u6587\u4ef6\u5377\u540e\u4f1a\u52a0\u8f7dfastfat\u9a71\u52a8\uff0c\u7136\u540e\u5c06\u81ea\u5df1\u5378\u8f7d\uff1a<\/p>  <p>\u65b0\u589e\u52a0\u7684Fat\u8bbe\u5907\uff1a<\/p>  <p><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fat \\FileSystem\\fastfat DriverObject fffffa8005809e70<\/strong><\/p>  <p>\u6d88\u5931\u7684FatDiskRecognizer:<\/p>  <p><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; FatDiskRecognizer \\FileSystem\\Fs_Rec DriverObject fffffa80044e2060<\/strong><\/p>  <p>Windows I\/O Manager\u8fd8\u63d0\u4f9b\u6587\u4ef6\u7cfb\u7edf\u6ce8\u518c\u4e8b\u4ef6\u7684\u901a\u77e5\uff0c\u8fd9\u90e8\u5206\u5c31\u662f\u5728IoRegisterFileSystem\u51fd\u6570\u4e2d\u5b9e\u73b0\u7684\u3002IoRegisterFileSystem\u5728\u5c06\u6587\u4ef6\u7cfb\u7edf\u7684Device Object\u6302\u5165\u76f8\u5e94\u7684\u961f\u5217\u4e2d\u4ee5\u540e\uff0c\u8fd8\u4f1a\u8c03\u7528\u6240\u6709\u7684NotificationRoutine\u4ee5\u901a\u77e5\u5176\u6ce8\u518c\u8005\u3002\uff08\u6ce8\u518c\u8005\uff0c\u5373\u5bf9\u6b64\u4e8b\u4ef6\u611f\u5174\u8da3\u7684\u9a71\u52a8\u3002\u4e00\u822c\u6765\u8bf4\uff0c\u5bf9\u6587\u4ef6\u7cfb\u7edf\u6ce8\u518c\u611f\u5174\u8da3\u7684\u53ea\u6709file system filter driver\u3002\uff09Windows \u5185\u6838\u63d0\u4f9b\u4e863\u4e2a\u51fd\u6570\u7528\u4e8e\u6587\u4ef6\u7cfb\u7edf\u6ce8\u518c\u4e8b\u4ef6\u7684\u901a\u77e5\uff1a<\/p>  <p><font face=\"Arial\">NTSTATUS      <br \/>&#160; IoRegisterFsRegistrationChange(       <br \/>&#160;&#160;&#160; IN PDRIVER_OBJECT&#160; DriverObject,       <br \/>&#160;&#160;&#160; IN PDRIVER_FS_NOTIFICATION&#160; DriverNotificationRoutine       <br \/>&#160;&#160;&#160; );<\/font><\/p>  <p><font face=\"Arial\">NTSTATUS      <br \/>&#160; IoRegisterFsRegistrationChangeEx(       <br \/>&#160;&#160;&#160; IN PDRIVER_OBJECT&#160; DriverObject,       <br \/>&#160;&#160;&#160; IN PDRIVER_FS_NOTIFICATION&#160; DriverNotificationRoutine       <br \/>&#160;&#160;&#160; );&#160; \/* available from Win2k SP4 and its successor OS *\/       <br \/>      <br \/>VOID&#160; <br \/>&#160; IoUnregisterFsRegistrationChange(       <br \/>&#160;&#160;&#160; IN PDRIVER_OBJECT&#160; DriverObject,       <br \/>&#160;&#160;&#160; IN PDRIVER_FS_NOTIFICATION&#160; DriverNotificationRoutine       <br \/>&#160;&#160;&#160; );<\/font><\/p>  <p>\u5173\u4e8e\u8fd9\u4e09\u4e2a\u51fd\u6570\u7684\u4f7f\u7528\u8bf7\u53c2\u9605DDK\u6587\u6863\uff0c\u5728\u6b64\u4e0d\u505a\u71ac\u8ff0\u3002<\/p>  <p>&#160;<\/p>  <h3>Linux\u5e73\u53f0\u4e0a\u7684\u6587\u4ef6\u7cfb\u7edf\u6ce8\u518c\u8fc7\u7a0b\uff1a<\/h3>  <p>Linux\u5185\u6838(VFS\uff1aVirtual Filesystem)\u63d0\u4f9b\u4e86\u4e24\u4e2a\u652f\u6301\u4f8b\u7a0b\u5206\u522b\u8fdb\u884c\u6587\u4ef6\u7cfb\u7edf\u7684\u6ce8\u518c\u548c\u79fb\u9664\uff1a<\/p>  <p><font face=\"Arial\">int register_filesystem(struct file_system_type * fs)      <br \/>int unregister_filesystem(struct file_system_type * fs)<\/font><\/p>  <p>struct file_system_type\u7ed3\u6784\u5c31\u4ee3\u8868\u4e00\u4e2a\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\uff0c\u6b64\u7ed3\u6784\u7531\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u7a0b\u5e8f\u5404\u81ea\u5b9a\u4e49\uff0c\u5176\u7ed3\u6784\u4f53\u5982\u4e0b\uff1a<\/p>  <p><font face=\"Arial\">struct file_system_type {      <br \/>&#160;&#160;&#160; const char *name;       <br \/>&#160;&#160;&#160; int fs_flags;       <br \/>&#160;&#160;&#160; int (*get_sb) (struct file_system_type *, int,       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; const char *, void *, struct vfsmount *);       <br \/>&#160;&#160;&#160; void (*kill_sb) (struct super_block *);       <br \/>&#160;&#160;&#160; struct module *owner;       <br \/>&#160;&#160;&#160; struct file_system_type * next;       <br \/>&#160;&#160;&#160; struct list_head fs_supers;<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; struct lock_class_key s_lock_key;      <br \/>&#160;&#160;&#160; struct lock_class_key s_umount_key;<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; struct lock_class_key i_lock_key;      <br \/>&#160;&#160;&#160; struct lock_class_key i_mutex_key;       <br \/>&#160;&#160;&#160; struct lock_class_key i_mutex_dir_key;       <br \/>&#160;&#160;&#160; struct lock_class_key i_alloc_sem_key;       <br \/>};<\/font><\/p>  <p>\u7ed3\u6784\u6210\u5458\u8bf4\u660e\uff1a<\/p>  <ul>   <li><font face=\"Arial\"><strong>name\uff1a<\/strong> \u6587\u4ef6\u7cfb\u7edf\u540d\u79f0\uff1a\u5982ext3\uff0cext4\uff0cnfs\uff0cnfs4\uff0clustre\u7b49 <\/font><\/li>    <li><font face=\"Arial\"><strong>fs_flags:<\/strong> \u6587\u4ef6\u7cfb\u7edf\u76f8\u5173\u6807\u5fd7\u4f4d\uff0c\u76ee\u524d\u6709\u5982\u4e0b\u53d6\u503c\uff1a         <br \/>#define FS_REQUIRES_DEV 1&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/* \u6b64\u6587\u4ef6\u7cfb\u7edf\u9002\u7528\u4e8e\u5377\u8bbe\u5907\uff0c\u5982\u786c\u76d8\u5206\u533a\u7b49         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \u4e0d\u9002\u7528\u4e8e\u7f51\u7edc\u6587\u4ef6\u7cfb\u7edf *\/         <br \/>#define FS_BINARY_MOUNTDATA 2&#160; \/* \u6b64\u6587\u4ef6\u7cfb\u7edf\u6709\u5355\u72ec\u7684mount tool, \u53c2\u6570\u7684\u4f20\u9012\u6709         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \u81ea\u5df1\u7684\u683c\u5f0f\uff0c\u6b64\u6807\u5fd7\u76ee\u524d\u7528\u4e8ecoda, FUSE, nfs,         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; smbfs, ncpfs *\/         <br \/>#define FS_HAS_SUBTYPE 4&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/* \u4ec5 FUSE\u4f7f\u7528\uff0c\u652f\u6301\u591a\u79cduser mode\u6587\u4ef6\u7cfb\u7edf *\/         <br \/>#define FS_REVAL_DOT&#160;&#160;&#160; 16384&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/* \u4ec5NFS\u4f7f\u7528\uff0c&quot;.&quot;\u53ca&quot;..&quot;\u4f1a\u8fc7\u671f\u6216\u5931\u6548&#160; *\/         <br \/>#define FS_RENAME_DOES_D_MOVE&#160;&#160;&#160; 32768&#160;&#160;&#160; \/* \u4ec5NFS\u4f7f\u7528\uff0c\u6587\u4ef6\u7cfb\u7edf\u5728.rename\u64cd\u4f5c         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \u5df2\u5904\u7406 d_move() \u60c5\u5f62 *\/ <\/font><\/li>    <li><font face=\"Arial\"><strong>get_sb<\/strong>:<strong>&#160; <\/strong>\u6302\u8f7d\u65b0\u5377\u65f6\u7684\u56de\u8c03\u51fd\u6570\uff0c\u7531VFS\u8c03\u7528\uff0c\u591a\u6570\u60c5\u51b5\u662f\u7528\u6237\u8fdb\u884c\u4e86mount(2)\u64cd\u4f5c <\/font><\/li>    <li><font face=\"Arial\"><strong>kill_sb<\/strong>:&#160;&#160; \u5378\u8f7d\u5df2\u6302\u8f7d\u5377\u65f6\u7684\u56de\u8c03\u51fd\u6570\uff0c\u4e00\u822c\u7531\u7528\u6237\u8fdb\u884cumount(2)\u64cd\u4f5c\u800c\u89e6\u53d1 <\/font><\/li>    <li><font face=\"Arial\"><strong>owner:<\/strong>&#160;&#160; \u6587\u4ef6\u7cfb\u7edf\u6240\u5728\u6a21\u5757(module) <\/font><\/li>    <li><font face=\"Arial\"><strong>next<\/strong>:&#160;&#160;&#160;&#160;&#160; \u4f9bVFS\u4f7f\u7528\uff0c\u7ec4\u6210\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u7684\u5355\u5411\u5217\u8868 <\/font><\/li>    <li><font face=\"Arial\"><strong>fs_supers<\/strong>: \u4f9bVFS\u4f7f\u7528\uff0c\u53cc\u5411\u94fe\u8868\u94fe\u9996\uff0c\u7528\u4ee5\u7ba1\u7406\u6b64\u6587\u4ef6\u7cfb\u7edf\u6240\u8bc6\u522b\u7684\u6240\u6709\u7684\u6587\u4ef6\u5377\u7684         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \u8d85\u7ea7\u5757( super_block\uff09 <\/font><\/li>    <li><font face=\"Arial\">s_lock_key \u2026 i_alloc_sem_key: \u7528\u4e8elockdep\u68c0\u67e5<\/font> <\/li> <\/ul>  <p>\u770b\u4e00\u4e0bkernel\u4e2dext4\u7684\u76f8\u5173\u4ee3\u7801\uff1a<\/p>  <p><font face=\"Arial\">static struct file_system_type <strong>ext4_fs_type<\/strong> = {       <br \/>&#160;&#160;&#160; .owner&#160;&#160;&#160;&#160;&#160;&#160;&#160; = THIS_MODULE,       <br \/>&#160;&#160;&#160; .name&#160;&#160;&#160;&#160;&#160;&#160;&#160; = &quot;ext4&quot;,       <br \/>&#160;&#160;&#160; .get_sb&#160;&#160;&#160;&#160;&#160;&#160;&#160; = ext4_get_sb,       <br \/>&#160;&#160;&#160; .kill_sb&#160;&#160;&#160; = kill_block_super,       <br \/>&#160;&#160;&#160; .fs_flags&#160;&#160;&#160; = FS_REQUIRES_DEV,       <br \/>};<\/font><\/p>  <p><font face=\"Arial\">\/* \u5982\u679cext3\u6a21\u5757\u6ca1\u88ab\u5b9a\u4e49\uff0cext4\u6587\u4ef6\u7cfb\u7edf\u5c06\u9ed8\u8ba4\u63a5\u7ba1ext3\u6587\u4ef6\u5377 *\/      <br \/>#if !defined(CONTIG_EXT3_FS) &amp;&amp; !defined(CONFIG_EXT3_FS_MODULE) &amp;&amp; defined(CONFIG_EXT4_USE_FOR_EXT23)       <br \/>      <br \/>static struct file_system_type <strong>ext3_fs_type<\/strong> = {       <br \/>&#160;&#160;&#160; .owner&#160;&#160;&#160;&#160;&#160;&#160;&#160; = THIS_MODULE,       <br \/>&#160;&#160;&#160; .name&#160;&#160;&#160;&#160;&#160;&#160;&#160; = &quot;ext3&quot;,       <br \/>&#160;&#160;&#160; .get_sb&#160;&#160;&#160;&#160;&#160;&#160;&#160; = ext4_get_sb,       <br \/>&#160;&#160;&#160; .kill_sb&#160;&#160;&#160; = kill_block_super,       <br \/>&#160;&#160;&#160; .fs_flags&#160;&#160;&#160; = FS_REQUIRES_DEV,       <br \/>};<\/font><\/p>  <p><font face=\"Arial\">static inline void register_as_ext3(void)      <br \/>{       <br \/>&#160;&#160;&#160; int err = register_filesystem(&amp;ext3_fs_type);       <br \/>&#160;&#160;&#160; if (err)       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; printk(KERN_WARNING       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;EXT4-fs: Unable to register as ext3 (%d)\\n&quot;, err);       <br \/>}<\/font><\/p>  <p><font face=\"Arial\">static inline void unregister_as_ext3(void)      <br \/>{       <br \/>&#160;&#160;&#160; unregister_filesystem(&amp;ext3_fs_type);       <br \/>}       <br \/>MODULE_ALIAS(&quot;ext3&quot;);       <br \/>#endif<\/font><\/p>  <p>ext4\u6a21\u5757\u7684\u521d\u59cb\u5316\u51fd\u6570(init_ext4_fs)\u4f1a\u8c03\u7528register_filesystem\u6765\u6ce8\u518c\u6587\u4ef6\u7cfb\u7edf\u4e3aext4.<\/p>  <p><font face=\"Arial\">static int __init <strong>init_ext4_fs<\/strong>(void)       <br \/>{       <br \/>&#160;&#160;&#160; int err;<\/font><\/p>  <p><font face=\"Arial\">......<\/font><\/p>  <p><font face=\"Arial\"><strong>&#160;&#160;&#160; register_as_ext3<\/strong>();       <br \/>&#160;&#160;&#160; err = <strong>register_filesystem(&amp;ext4_fs_type)<\/strong>;       <br \/>&#160;&#160;&#160; if (err)       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; goto out;       <br \/>......<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160;&#160;&#160;&#160;&#160; return err;      <br \/>}<\/font><\/p>  <p>\u7136\u540e\u518d\u7814\u7a76\u4e00\u4e0bregister_filesystem\u53caunregister_filesystem\u7684\u4ee3\u7801\uff08$kernel\/vfs\/filesystems.c\uff09:<\/p>  <p><font face=\"Arial\">static struct file_system_type *file_systems;      <br \/>static DEFINE_RWLOCK(file_systems_lock);<\/font><\/p>  <p><font face=\"Arial\">\/**      <br \/>*&#160;&#160;&#160; register_filesystem - register a new filesystem       <br \/>*&#160;&#160;&#160; @fs: the file system structure       <br \/>*       <br \/>*&#160;&#160;&#160; Adds the file system passed to the list of file systems the kernel       <br \/>*&#160;&#160;&#160; is aware of for mount and other syscalls. Returns 0 on success,       <br \/>*&#160;&#160;&#160; or a negative errno code on an error.       <br \/>*       <br \/>*&#160;&#160;&#160; The &amp;struct file_system_type that is passed is linked into the kernel       <br \/>*&#160;&#160;&#160; structures and must not be freed until the file system has been       <br \/>*&#160;&#160;&#160; unregistered.       <br \/>*\/       <br \/>&#160; <br \/>int register_filesystem(struct file_system_type * fs)       <br \/>{       <br \/>&#160;&#160;&#160; int res = 0;       <br \/>&#160;&#160;&#160; struct file_system_type ** p;<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; BUG_ON(strchr(fs-&gt;name, '.'));      <br \/>&#160;&#160;&#160; if (fs-&gt;next)       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return -EBUSY;       <br \/>&#160;&#160;&#160; INIT_LIST_HEAD(&amp;fs-&gt;fs_supers);       <br \/>&#160;&#160;&#160; write_lock(&amp;file_systems_lock);       <br \/>&#160;&#160;&#160; p = find_filesystem(fs-&gt;name, strlen(fs-&gt;name));       <br \/>&#160;&#160;&#160; if (*p)       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; res = -EBUSY;       <br \/>&#160;&#160;&#160; else       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; *p = fs;       <br \/>&#160;&#160;&#160; write_unlock(&amp;file_systems_lock);       <br \/>&#160;&#160;&#160; return res;       <br \/>}<\/font><\/p>  <p><font face=\"Arial\">EXPORT_SYMBOL(register_filesystem);<\/font><\/p>  <p><font face=\"Arial\">static struct file_system_type **find_filesystem(const char *name, unsigned len)      <br \/>{       <br \/>&#160;&#160;&#160; struct file_system_type **p;       <br \/>&#160;&#160;&#160; for (p=&amp;file_systems; *p; p=&amp;(*p)-&gt;next)       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (strlen((*p)-&gt;name) == len &amp;&amp;       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; strncmp((*p)-&gt;name, name, len) == 0)       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;       <br \/>&#160;&#160;&#160; return p;       <br \/>}<\/font><\/p>  <p><font face=\"Arial\">\/**      <br \/>*&#160;&#160;&#160; unregister_filesystem - unregister a file system       <br \/>*&#160;&#160;&#160; @fs: filesystem to unregister       <br \/>*       <br \/>*&#160;&#160;&#160; Remove a file system that was previously successfully registered       <br \/>*&#160;&#160;&#160; with the kernel. An error is returned if the file system is not found.       <br \/>*&#160;&#160;&#160; Zero is returned on a success.       <br \/>*&#160;&#160;&#160; <br \/>*&#160;&#160;&#160; Once this function has returned the &amp;struct file_system_type structure       <br \/>*&#160;&#160;&#160; may be freed or reused.       <br \/>*\/       <br \/>&#160; <br \/>int unregister_filesystem(struct file_system_type * fs)       <br \/>{       <br \/>&#160;&#160;&#160; struct file_system_type ** tmp;<\/font><\/p>  <p><font face=\"Arial\">&#160;&#160;&#160; write_lock(&amp;file_systems_lock);      <br \/>&#160;&#160;&#160; tmp = &amp;file_systems;       <br \/>&#160;&#160;&#160; while (*tmp) {       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (fs == *tmp) {       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; *tmp = fs-&gt;next;       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; fs-&gt;next = NULL;       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; write_unlock(&amp;file_systems_lock);       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0;       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; tmp = &amp;(*tmp)-&gt;next;       <br \/>&#160;&#160;&#160; }       <br \/>&#160;&#160;&#160; write_unlock(&amp;file_systems_lock);       <br \/>&#160;&#160;&#160; return -EINVAL;       <br \/>}<\/font><\/p>  <p>\u901a\u8fc7\u4ee3\u7801\u53ef\u4ee5\u5f97\u77e5\uff0c\u4e0eWindows\u5bf9\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u7684\u7ba1\u7406\u4e0d\u540c\u7684\u662f\uff0cLinux\u53ea\u7ef4\u62a4\u4e86\u4e00\u4e2a\u5168\u5c40\u7684\u5355\u5411\u5217\u8868\u6765\u7ba1\u7406\u6240\u6709\u7684\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\uff0c\u800c\u4e14\u65b0\u6587\u4ef6\u7cfb\u7edf\u9ed8\u8ba4\u88ab\u94fe\u63a5\u81f3\u94fe\u8868\u672b\u5c3e\u3002<\/p>  <p>Linux\u4e0d\u5141\u8bb8\u540c\u540d\u7684\u6587\u4ef6\u7cfb\u7edf\u518d\u6b21\u88ab\u6ce8\u518c\uff0cregister_filesystem()\u6bcf\u6b21\u90fd\u4f1a\u8c03\u7528find_filesystem()\u4ee5\u68c0\u67e5\u540c\u540d\u7684\u6587\u4ef6\u7cfb\u7edf\u662f\u4e0d\u662f\u5df2\u5b58\u5728\u3002Windows\u5e73\u53f0\u4e0a\u56e0\u4e3a\u662f\u4ee5DeviceObject\u4e3a\u4e3b\u4f53\u8fdb\u884c\u6ce8\u518c\u7684\uff0c\u5e76\u4e0d\u5b58\u5728\u6b64\u9879\u7684\u68c0\u6d4b\uff0c\u6240\u4ee5Windows\u5141\u8bb8\u591a\u4e2a\u540c\u4e00\u5377\u7c7b\u578b\u7684\u6587\u4ef6\u7cfb\u7edf\u9a71\u52a8\u7684\u52a0\u8f7d\uff0c\u4f46\u53ea\u6709\u6700\u665a\u52a0\u8f7d\u7684\u9a71\u52a8\u624d\u6709\u6548\uff08\u9ed8\u8ba4\u65e0DO_LOW_PRIORITY_FILESYSTEM\u6807\u5fd7\uff09\u3002<\/p><\/div>","protected":false},"excerpt":{"rendered":"<p>\u6587\u4ef6\u7cfb\u7edf\u662f\u4e00\u7c7b\u7279\u6b8a\u7684\u5185\u6838\u9a71\u52a8\uff0c\u4e3b\u8981\u8d1f\u8d23\u6570\u636e\u6d41\uff08\u5373\u6587\u4ef6\uff09\u7684\u7ba1\u7406\u3002\u7528\u6237\u7684\u89c6\u56fe\u6240\u663e\u793a\u51fa\u7684\u662f\u5404\u8272\u5404\u6837\u7684\u6587\u4ef6\u548c\u76ee\u5f55\uff0c\u4f46\u6700 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[9],"tags":[279,281,282,278,280],"views":2480,"_links":{"self":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts\/590"}],"collection":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=590"}],"version-history":[{"count":6,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts\/590\/revisions"}],"predecessor-version":[{"id":598,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts\/590\/revisions\/598"}],"wp:attachment":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}