20191323王予涵第十一章學習筆記
阿新 • • 發佈:2021-10-17
20191323王予涵第十一章學習筆記
知識點歸納
EXT2檔案系統組成:
0 | 1 | 2 | 3-7 | 8 | 9 | 10-32 | 33-... |
---|---|---|---|---|---|---|---|
引導塊 | 超級塊 | 塊組描述符 | 保留塊 | 塊點陣圖 | 索引節點點陣圖 | 索引節點 | 資料塊 |
引導塊:容納從磁碟引導作業系統的載入程式;
超級塊:容納整個檔案系統的資訊;
struct et2_super block { u32 s_inodes_count; /* Inodes count */ u32 s_blocks_count; /* Blocks count */ u32 s_r_blocks_count; /* Reserved blocks count */ u32 s_free blocks_count; /* Free blocks count */ u32 s_free_inodes_count; /* Free inodes count */ u32 s_first_data_block; /* First Data Block */ u32 s_log block_size; /* Block size */ u32 s_log_cluster_size; /* Al1ocation cluster size */ u32 s_blocks per_group; /* # Blocks per group * / u32 s_clusters per_group; /* # Fragments per group */ u32 s_inodes_per_group; /* # Inodes per group * / u32 s_mtime; /* Mount time * / u32 s_wtime; /* write time */ u16 s_mnt_count; /* Mount coune* / s16 s_max_ntcount; /* Maximal mount count */ u16 B_magic; /* Magic signature */ //more non-essential fields u16 s_inode_size; /* size of inode structure*/ }
索引節點: 每個檔案都用一個128位元組(EXT4中的是256位元組)的獨特索引節點結構體表示。
struct ext2_inode { u16 i_mode; // 16 bits =|ttttlugs|rwx|rwx|rwxl u16 i_uid; // owmer uid u32 i_size; // file size in bytes u32 i_atime; //time fields in seconds u32 i_ctime; // since 00:00:00,1-1-1970 u32 i_mtime; u32 _dtime; u16 i_gid; // group ID u16 i_links_count;// hard-link count u32 i_blocks; // number of 512-byte sectors u32 i_flags; //IGNORE u32 i_reservedl;// IGNORE u32 i_block[15];// See details below u32 _pad[7]; // for inode size = 128 bytes }
結構圖:
郵差演算法:
LA <=> BA:
-
LA = info
-
BA = (blcok, inode)
INODES_PER_BLCOK = BLCOK_SIZE/sizeof(INODE)
blcok = (info - 1) * INODES_PER_BLCOK + inode_table;
inode = (info - 1) % INODES_PER_BLCOK
遍歷EXT2系統檔案樹:
演算法
- 讀取超級塊;
- 讀取塊組描述符塊(1 + s_first_data_block),以訪問組0描述符。並從塊組描述符的bg_inode_table條目中找到索引節點的起始塊編號,將其成為InodesBeginBlock;
- 讀取InodesBeginBlock,獲取/的索引節點,即INODE#2;
- 將路徑名標記為元件字串,假設元件數量為恥例如,如果路徑名=/a/b/c,則組 件字串是“a”“b”“c”,其中n = 3。用name[0], namefl],…,name[n-l]來表示元件
- 從(3)中的根索引節點開始,在其資料塊中搜索name[0]。(5)。目錄索引節點的每個資料塊都包含 以下形式的dir entry結構體:
(ino rec_len name_len NAME] [ino rec_len name_len NAME)
其中NAME是一系列nlen字元,不含終止NULLO對於每個資料塊,將該塊讀入記憶體 並使用dir_entry *dp指向載入的資料塊。然後使用name」en將NAME提取為字串,並與 namefO]進行比較。如果它們不匹配,貝U通過以下程式碼轉到下一個dir_entry:
dp * (dir_entry *)((char *)dp + dp->rec_len))
繼續搜尋。如果存在name[0],則可以找到它的dir_entry,從而找到它的索引節點號。- 使用索引節點號ino來定位相應的索引節點。回想前面的內容,ino從1開始計數。 使用郵差演算法計算包含索引節點的磁碟塊及其在該塊中的偏移量。
blk = (ino - 1) * INODES_PER_BLOCK + InodesBeginBlock; offset = (ino - 1) % INODES_PER_BLOCK;
然後在索引節點中讀取/a,從中確定它是否是一個目錄(DIR)。如果/a不是目錄,則 不能有/a/b,因此搜尋失敗。如果它是目錄,並且有更多需要搜尋的元件,那麼繼續搜尋 下一個元件name[l]o現在的問題是:在索引節點中搜索/a的name[l],與第(5 )步完全 相同。
7.由於(5) - (6)步將會重複n次,所以最好編寫一個搜尋函式
u32 search(INODE *inodePtr, char *name) ( // search for name in the data blocks of current DIR inode // if found, return its ino; else return 0 )
- 呼叫search()n次,n為元件數量。