yaffs理解第三篇之yaffs_mount
很抱歉,前段時間比較忙,一直沒有繼續我的yaffs理解篇。今天來一起看一下我認為是理解yaffs檔案系統中最重要的函式yaffs_mount。(當然最重要也意味著最複雜,這個函式是最龐大的一個,一層套一層,讓我想到了“一個饅頭引發的血案”中的經典臺詞,圓環套圓環娛樂城)
在進行程式碼分析之前,先總體闡述下yaffs_mount的工作:
1.將指定的nand裝置掛載並檢查使用者指定的裝置是否合法,當然這裡的nand裝置也可以是nandflash的一個分割槽
2.對掛載的裝置進行進一步的初始化(我在yaffs理解第二篇——yaffs_startup函式解析提到,在starup時其實已經對裝置進行一個最基本的初始化
3.建立root、lostfound目錄,這些目錄是fake目錄,僅僅存在在記憶體中,起到輔助yaffs檔案系統的執行的作用,不是真實存在在nandflash上。
4.掃描整個掛載裝置的所有nand頁。這一步是整個yaffs_mount的核心,因此是yaffs檔案系統的核心的核心,下面我把這一步的工作分成幾部分來敘述。
a)掃描的工作會分成塊掃描和頁掃描兩個層次來進行。
b)首先進行塊掃描,檢查是否是壞塊,如果是壞塊,直接跳過頁掃描步驟,進行下一塊的掃描。
c)如果塊掃描的結果是好塊,將進入頁掃描步驟。頁掃描將對一塊的32頁進行分析。通過讀取每一頁的oob區(也就是最後的16個位元組)來判斷這一頁屬於什麼型別,基本的型別可以分為:已刪除頁,未使用頁,資料頁面,頭頁面。
●對於已刪除頁會直接進行下一頁的掃描。
●對於未使用頁,會判斷是否是這一塊的第一頁,如果是一塊的第一頁是未使用,yaffs會認為這一塊都是未使用,直接跳出頁掃描,進入下一塊掃描。
●對於資料頁面,表示這個page是某個yaffs_object的資料,並根據該頁面的oobobjecteID到RAM中尋找該yaffs_object是否在RAM中建立,若建立則將該頁加入至所屬的yaffs_object,否則先建立一個對應的yaffs_object,並將該頁加入至對應的yaffs_object。
●同理,對於頭頁面,也會做相應的操作。再根據頭頁面的parentobjectID到RAM 中尋找對應的父
至此整個yaffs_mount的流程介紹完畢,可以看到經過了這麼一個對nandflash的掃描過程,完全獲得了nandflash的所有資訊,並在記憶體中形成了一個具體層次梯度的檔案系統。