1. 程式人生 > 其它 >20191323王予涵第十一章學習筆記

20191323王予涵第十一章學習筆記

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. 讀取超級塊;
  2. 讀取塊組描述符塊(1 + s_first_data_block),以訪問組0描述符。並從塊組描述符的bg_inode_table條目中找到索引節點的起始塊編號,將其成為InodesBeginBlock;
  3. 讀取InodesBeginBlock,獲取/的索引節點,即INODE#2;
  4. 將路徑名標記為元件字串,假設元件數量為恥例如,如果路徑名=/a/b/c,則組 件字串是“a”“b”“c”,其中n = 3。用name[0], namefl],…,name[n-l]來表示元件
  5. 從(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,從而找到它的索引節點號。
  6. 使用索引節點號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
)
  1. 呼叫search()n次,n為元件數量。