1. 程式人生 > >杭州電子科技大學作業系統課程設計:簡單檔案系統的實現

杭州電子科技大學作業系統課程設計:簡單檔案系統的實現

emmmm想寫一個作業系統的課程設計說明,因為自己寫的時候也遇到了好多問題,外加感覺對實驗指導書的說明有些疑問,覺得寫出來可以給別人看看。但是感覺寫出來的東西……沒什麼好看的。

因為這個系統還是有點複雜,但是自己又沒有太多的時間和能力把這個複雜的系統說清楚。

儲存功能的介面實現

課程設計的檔案系統是個類似fat的檔案系統結構。fat的結構可以大致參考一下課程設計書或者上課ppt的內容,如下圖。磁碟被分為若干塊相同大小的磁碟塊,一個檔案的fcb會記錄一個檔案的大小和這個檔案對應的fat起始物理塊號,fat表會標記出一個物理塊號的下一個物理塊號,如果是EOF,則表明這個物理塊是一個檔案的最後一個物理塊。這些物理塊號的二進位制檔案串聯起來後,就是一個檔案的內容。
這裡寫圖片描述

每次檔案系統程式執行的時候,程式會申請一個大小為1024000位元組的記憶體空間,作為虛擬的磁碟空間。申請完成後,程式就會試圖開啟一個名為myfsys的檔案,這個檔案是上一次程式執行結束時,記憶體中的虛擬磁碟空間的備份。如果myfsys檔案不存在,或者myfsys的前八個位元組不是二進位制數01010101的話,程式就會進行系統的初始化,反之會通過fread()函式把myfsys讀進記憶體空間。

那麼怎麼把fcb結構體或字串寫進虛擬磁碟空間或者從虛擬磁碟空間讀出fcb結構體或字串呢?利用memcpy()函式就好了,這個函式可以自行地把各種變數的記憶體寫到其它記憶體上。因此,如果我們要讀出一個目錄檔案下有哪些檔案,只要根據這個目錄檔案的fcb從虛擬磁碟上讀出相應的資訊,然後把資訊載入到一個個fcb結構體中,就得到了其目錄下的fcb檔案。

檔案系統基礎功能的分析和實現

建立檔案功能

不管是建立資料夾還是建立檔案,其實都是在其父目錄對應的檔案目錄下新增一個新的fcb,只不過fcb的內容稍有不同,所以自己用my_touch()函式來建立對應的檔案(其實Linux下就有touch命令,就是用來建立檔案的),然後再根據這個檔案的型別進行其它的相應操作。

開啟檔案功能

與上同理,不管是開啟資料夾還是開啟檔案,其實就是開啟一個檔案fcb並讀取相關資訊。於是my_cd()函式和my_open()函式其實都是一樣的功能,寫一個,呼叫一個就好了。

指導書中的一些問題和疑惑

資料夾fcb中的...檔案項有什麼用

沒用,真的沒用,至少我認為用了這兩個檔案項會出bug,因為當你用./

這個目錄開啟當前目錄的時候,當前目錄會把./當成自己的父目錄,噹噹前目錄發生了修改,需要把修改後的資訊寫入父目錄時,其實際父目錄不會發生修改。
然後自己是寫了一個rewrite_dir()函式來把輸入的目錄改寫成一個完整的目錄,每次從根目錄開啟資料夾,避免使用...檔案項。