2011年5月18日 星期三

note for Fat File System

最近在研讀檔案系統(file system)的程式碼,
1.  支援 FAT 12,16,32
 根據WIKI的定義: 
檔案配置表英語File Allocation Table首字母縮略字:FAT)又稱文件分配表,是一種由微軟發明並擁有部份專利[2]文件系統,供MS-DOS使用,也是所有非NT核心的微軟視窗使用的檔案系統。
FAT文件系統考慮當時電腦效能有限,所以未被複雜化,因此幾乎所有個人電腦作業系統都支援。這特性使它成為理想的軟碟記憶卡檔案系統,也適合用作不同作業系統中的資料交流。
但FAT有一個嚴重的缺點:當文件刪除後寫入新資料,FAT不會將檔案整理成完整片段再寫入,長期使用後會使檔案資料變得逐漸分散,而減慢了讀寫速度。磁碟重組是一種解決方法,但必須經常重組來保持FAT文件系統的效率。



這也是MSDOS和CP/M(想當年,有摸過) 的唯一差異.

2. BPB (BIOS Parameter Block)BIOS 參數區塊
struct fat_bpb_s
{
    char      xt_bs_jmpboot[3];
    char      xt_bs_oemname[8];
    char      xt_bpb_bytespersec[2];
    char      xt_bpb_secperclus;
    char      xt_bpb_resvdseccnt[2];
    char      xt_bpb_numfats;
    char      xt_bpb_bootentcnt[2];
    char      xt_bpb_totsec16[2];
    char      xt_bpb_media;
    char      xt_bpb_fatsz16[2];
    char      xt_bpb_secpertrk[2];
    char      xt_bpb_numheads[2];
    char      xt_bpb_hiddsec[4];
    char      xt_bpb_totsec32[4];
    union _diffpart{
            struct _fat1216
            {
                char      xt_bpb_drvnum;
                char      xt_bpb_reserved1;
                char      xt_bpb_bootsig;
                char      xt_bpb_volid[4];
                char      xt_bpb_vollab[11];
                char      xt_bpb_filsystype[8];
            }xt_fat1216;
            struct _fat32
            {
                char      xt_bpb_fatsz32[4];
                char      xt_bpb_extflags[2];
                char      xt_bpb_fsver[2];
                char      xt_bpb_bootclus[4];
                char      xt_bpb_fsinfo[2];
                char      xt_bpb_bkbootsec[2];
                char      xt_bpb_reserved[12];
                char      xt_bpb_drvnum;
                char      xt_bpb_reserved1;
                char      xt_bpb_bootsig;
                char      xt_bpb_volid[4];
                char      xt_bpb_vollab[11];
                char      xt_bpb_filsystype[8];
            }xt_fat32; 
        }xt_diff;
}

3.如何使用人家建好的LIB呢(呼叫API)?
  • include api.h 
  • call init() (作初始化)
  • ret = media_open( drive_letter, media_driver_ptr, driver_info_ptr ); (儲存媒體,如SD)如果成功傳回OK
    • drive_letter:  磁碟機的名字,如“F"。
    • media_driver_ptr:  function pointer指向media
    •  driver_info_ptr: piece of data
  • ret = media_format( media_handle, volume_label );(格式化,可作可不作,會把資料破壞)
  • ret = file_system_open( drive_letter );(開啟檔案系統)
    • file_handle_t* fp;
    • error_type_t e_res;
    • e_res = fat_file_open( filename, mode, &fp );
  • ret = media_and_filesystem_close( filesystem );(關閉檔案系統)

沒有留言: