日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

文件系统:FAT16

發布時間:2024/3/26 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件系统:FAT16 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前文介紹了FAT12,本文則介紹FAT16。顧名思義,FAT表項占用16bits即FAT16。其特點:

  • 每個FAT表項占用16bits
  • 磁盤容量2.1MB到2048MB
  • 簇數4085到65524
  • FAT16結構


    每個扇區默認512字節;根據容量不同,每個簇有1至64個扇區。

    FAT表2(如果存在)是FAT表1的備份。
    根目錄最多包涵512個目錄項

    DBR結構

    typedef struct {__u8 JMP[3]; //0 __u8 OEM[8]; //3__u16 SectorBytes; //11 每扇區字節數__u8 ClusterSectors; //13 每簇扇區數__u16 ReservedSectors; //14 保留扇區數(含DBR扇區)__u8 FATs; //16 FAT表個數__u16 RootEntries; //17 根目錄文件數__u16 TotalSectorsL; //19 磁盤總扇區數(﹤32MB)__u8 MediaType; //21 介質描述符0xF0__u16 FatSectors; //22 FAT表所占扇區數__u8 res2[8]; //24__u32 TotalSectorsH; //32 磁盤總扇區數(≧32MB)__u8 res3[2]; //36__u8 ExtBootSignature; //38 擴展引導標記0x29__u32 VolumeSerial; //39 卷序列號__u8 Volume[11]; //43 卷標__u8 FS[8]; //54 文件系統類型FAT12__u8 res4[448]; //62 引導代碼區 __u16 Signature; //510 結束標志0xAA55 }fat16_dbr_t;

    FAT表

    FAT即File Allocation Table,它表示文件的分配信息;每個FAT表項為16bits;簇號從2開始(簇號0和1保留);每個簇值指向下一個簇號;

    #define FAT16_CLUSTER_UNUSED 0x0000 #define FAT16_CLUSTER_END 0xFFF8 #define FAT16_CLUSTER_BAD 0xFFF7__u16 fat16_get_next_cluster(__u16 current) {return = *((__u16*)&m_pFAT[current * 2]); }


    上圖中,簇號0和1分別為0xfff8、0xffff
    簇2指向0x0003,簇3指向0x004,簇4指向0x005,……
    如果知道了文件的起始簇號,那么就可以從FAT表中取得完整的簇鏈。

    目錄項結構

    目錄項結構存放文件名稱、屬性、時間、起始簇號等信息。分長名和短名,短名含一個目錄項結構,長名則包括多個目錄項結構。

    #define FILE_ATTR_READONLY 0x01 #define FILE_ATTR_HIDDEN 0x02 #define FILE_ATTR_SYSTEM 0x04 #define FILE_ATTR_VOLUME 0x08 #define FILE_ATTR_LONGNAME 0x0F #define FILE_ATTR_DIRECTORY 0x10 #define FILE_ATTR_ARCHIVE 0x20typedef struct {__u8 name[11]; // 短名 8.3結構__u8 attribute; // 文件屬性__u8 res1;__u8 refine;__u16 create_time; // 文件創建時間__u16 create_date;__u16 access_date; // 文件訪問時間__u16 start_cluster_h; // 文件起始簇號__u16 modify_time; // 文件修改時間__u16 modify_date;__u16 start_cluster_l; __u32 size; // 文件大小 }fat_directory_t;typedef struct {__u8 Index; // 文件名序號,倒序,第一個加0x40,低4位表示長目錄項個數__u8 Name1[10]; // 文件名[1-5],unicode編碼__u8 attr; // 屬性:0x0F(長名)__u8 res1;__u8 chksum; // 目錄項校驗和__u8 Name2[12]; // 文件名[6-11],unicode編碼__u8 res2[2];__u8 Name3[4]; // 文件名[12-13],unicode編碼 }fat_long_directory_t;

    一個長目錄項最多包含文件名中的13個unicode字符,多項按序號拼接可得完整的文件名。一個長文件名占用的目錄項個數:(文件名字符數 + 12) / 13 + 1(有長名就有短名)。下圖中文件名commonui_zh_CN.str占用二個長目錄項和一個短目錄項。

    格式化

  • 查容量表得簇大小
  • 計算總簇數
  • 根據總簇數計算FAT表扇區數
  • 減去根目錄32個扇區
  • 剩余扇區數(>=1)歸為保留扇區
  • 填寫DBR信息
  • 根據容量創建鏡像

  • 查容量表得簇大小
  • 計算總簇數
  • 根據總簇數計算FAT表扇區數
  • 減去根目錄32個扇區
  • 剩余扇區數(>=1)歸為保留扇區
  • 填寫DBR信息
  • 向根目錄添加子目錄(順序分配簇號、計算并創建長短目錄項)
  • 向根目錄添加文件(順序分配簇號、計算并創建長短目錄項、拷貝文件內容)
  • 向子目錄添加文件/目錄(計算長短目錄項,檢查子目錄所在簇剩余空間,不夠則分配新簇并擴展簇鏈;創建長短目錄項;為文件分配簇鏈,拷貝文件內容)
  • 根據目錄創建鏡像

  • 遞歸計算各級目錄下的長短目錄項大小和文件長度
  • 按不同簇大小對齊計算累加大小并與容量表中的簇大小進行適配得到合適的簇大小及總容量
  • 根據總容量進行格式化
  • 遞歸添加文件和目錄
  • 總結

    以上是生活随笔為你收集整理的文件系统:FAT16的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。