操作系统课设--扩展文件系统
山東大學操作系統課設lab4
- 實驗四 擴展文件系統(lab4)
- 概念欠缺
- 實驗目的
- 實驗環境:
- 實驗思路:
- 關鍵源代碼注釋以及程序說明:
- 調試記錄:
實驗四 擴展文件系統(lab4)
概念欠缺
- ifdef else 兩個類名一樣,用參數來確定使用哪個
實驗目的
擴展Nachos的文件系統。Nachos的文件系統是一個簡單并且能力有限的系統,限制之一就是文件的大小是不可擴展的。通過擴展,使得文件的大小是靈活可變的。
實驗環境:
虛擬機下Ubuntu Linux 16.04 LTS系統,nachos-3.4內核管理模塊和MIPS CPU軟件模擬模塊,文件系統模塊,代碼在lab4文件夾下面實現。
實驗思路:
看filesys.h&filesys.cc。 filesys.h里是兩種情況下的FileSystem類,里面方法都差不多,Create(),open(),remove()。情況為FileSys時,多了一個方法void List(),以及兩個private屬性freeMapFile,directoryFile。然后在filesys.cc里主要看這3個方法的內部實現和不同的屬性、方法到底起了什么作用。Filesys.cc里引用了bitmap.h、directory.h,于是先去看bitmap.h&directory.h&directory.cc。 filehdr.h里所引用的disk.h和bitmap.h,分別在machine文件夾和userprog文件夾里。我對位圖這個概念未有了解,搜到這個網頁:https://www.jianshu.com/p/bf9dbbc147ed,我沒有很詳細地看那個例子的代碼,只是大概看了一下BitMap算法,是用bit代替真實的數,這樣節省了大量空間,很適合大量數據的排序、查詢等問題。
其中disk.h里是:
Bitmap.h里是:
看到directory.h的代碼,方法與bitmap.h類似。
兩者都有FetchFrom()和WriteBack()方法。
回到filehdr.h的代碼,只有一個類FileHeader,里面內容如下
FileHeader創建一個文件頭,包含分配給文件數據的磁盤空間,用freeMap存儲。其中,每一空間對應著每一個扇區Sector。文件系統被分配了m個軌道Track,每個Track里有n個扇區Sector,1個Sector里可以放x個字節byte。塊block是數據存儲的最小單位,是系統級的;扇區Sector是驅動可以操作的最小單位,是磁盤級別的;通過Bitmap的find()為扇區每個byte分配數據。
FileSys.h啟動時,必須先讀以上2個文件:Directory、Bitmap,通過這2個文件創建文件頭指針,分別叫dirhdr、maphdr,都是用FetchFrom方法讀。其中maphdr占用第0個sector,dirhdr占用第1個sector。
而且在machine文件夾里的disk.h中發現已經定義好了disk中有32個track,1個track中有32個sector,1個sector里有128個字節。
在網上搜到,要擴展文件系統,是在fstest.cc里的Append()內部實現。
所以下面主要關注Append()
關鍵源代碼注釋以及程序說明:
先看Append()本來在寫什么東西。
前2張圖片再說append()將from文件內容附加在to文件后面,先打開from和to文件,如果to文件不存在,則用openFile代表to文件。
在while循環里面,每次從from里讀取1個字節,寫入to
可以看到,都是openFile在操作寫、讀操作,所以看openFile.h&openFile.cc。
看代碼發現,openFile里的方法主要是Write、Read、WriteAt、ReadAt這4個,while里面用到的Write()就是openFile里的Write(),如下:
可以看出,調用了WriteAt(),如下:
WriteAt()看起來好復雜,傳進去的參數定義是into:字節內容;numBytes:內容字節長度;seekPosition:從哪個位置開始寫入,上次寫完的位置,是int值。
注意到2個加了注釋的代碼段
是需要我們修改的。
其中第1個return 0的情況應該有所改變,position>=fileLength,表示著寫入的位置大于或者等于當前文件長度,但是當Append()時,確實是從當前文件長度的下一位開始寫,即數組的第fileLength位,所以將>=改成>
第二個是在講說加入的文件長度加上原來的文件內容字節長度會不會超過總文件能承載的長度,如果不能,則簡單粗暴地減去原有的內容字節長度,這樣原有的文件內容就改變了,這肯定是不對的。需要進行修改。通過openFile引用的Filehdr.h來實現文件合理擴展。在filehdr.cc中對FileHeader進行修改,加一個函數ExpandSpace()。
給原始的文件頭加一個擴展空間的方法,先計算除所有的扇區大小;NumClear()是計算字節數。如果還需要放進去的扇區字節大于還可以放進去的空間,那就是不行的,直接把預留的空間收回,返回FALSE;否則就繼續分配空間,返回TRUE。Freemap.find()是找一個空閑扇區,將其標記并返回扇區號。Userprog文件夾里的bitmap.cc有Find()方法的內部邏輯。
WriteAt()把原來兩行注釋改成如下,寫了AllocateSpace()方法去調用fileheader的ExpandSpace(),WriteAt()調用AllocateSpace()。
整體思路我再順一遍,是fstest.cc里的Append()方法里有一段openFile.Write(),用來擴展寫入文件。Write()在openFile.cc調用了WriteAt(),WriteAt()里需要修改補充擴展文件的方法,其中加入了AllocateSpace()方法,還是在openFile.cc里面。現在修改的filehdr.AllocateSpace()里需要寫具體如何擴展文件,涉及底層問題,需要到扇區里去找,因為文件扇區分配是通過Bitmap來映射的,于是寫在Filehdr里新加的ExpandSpace()調用Bitmap.find()。而所有方法的參數傳遞都是size。
調試記錄:
把lab4里的DISK刪掉,./nachos -f格式化則會出現一個DISK,格式化是恢復初始設置。./nachos -D則是顯示DISK里面的內容。
現在./nachos -cp test/small small將small內容copy到DISK中,并命名為small。
有copy到DISK里,可以看出small是38
./nachos -cp test/big big將big內容copy到DISK中,并命名為big。
是有copy進DISK里,可以看出big是608,但是,
DISK里直接看不到,只能用./nachos -D看到,不懂為啥。不過算是可以擴展文件系統了。
總結
以上是生活随笔為你收集整理的操作系统课设--扩展文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统课设--使用信号量解决生产者/消
- 下一篇: 操作系统课设--具有二级索引的文件系统