操作系统课设--具有二级索引的文件系统
山東大學操作系統課設lab5
- 實驗五 具有二級索引的文件系統(lab5)
- 實驗目的
- 實驗環境
- 實驗思路
- 調試記錄
實驗五 具有二級索引的文件系統(lab5)
實驗目的
Nachos系統原有的文件系統只支持單級索引,最大能存取NumDirect * SectorSize的大小的文件。本次試驗將在理解原文件系統的組織結構基礎上擴展原有的文件系統,設計并實現具有二級索引的文件系統。
實驗環境
虛擬機下Ubuntu Linux 16.04 LTS系統,nachos-3.4內核管理模塊和MIPS CPU軟件模擬模塊,文件系統模塊,代碼在lab5文件夾下面實現。
實驗思路
有參考這個:https://wenku.baidu.com/view/049223482b160b4e767fcfd6.html
其實通過lab4就可以看出,思路是沿著fstest.cc里的Append()去擴展文件系統,具體是Append()里的openFile.Write(),更底層就到了Write()調用的WriteAt()。說到底,就是這一小段代碼最終確定了如何分配,如何擴展,如何索引整個文件系統的扇區。所以在lab5實驗里只用關注AllocateSpace()方法就好。(不對)
因為filesystem里Create()方法有創建文件頭對象,且構造方法里也有調用到filehdr里的Allocate()等方法,所以filehdr.cc里的每個方法,只要涉及到數組保存,都要由一個數組寫成兩個數組,才能完成由一級索引到二級索引的轉換。
之前lab4里的filehdr.cc里的Allocate(),文件是通過一個數組dataSectors來進行分配的。
Filehdr.h里最初的定義部分有:
#define NumDirect ((SectorSize - 2 * sizeof(int)) / sizeof(int))
這是在filehdr.h里private定義dataSectors[]的大小
之前在lab4實驗報告里有說,
所以一個sector里128個字節,sectorSize = 128,sizeof(int) = 4,則NumDirect = 30,即有存儲文件消耗30個sector,30*128 = 3840,即文件可占字節為3840
想要擴展文件系統,還是從存儲文件字節的數組下手。
建立一個dataSectors2數組,
定義大小
==#define NumDirect2 (SectorSize/sizeof(int)) == 大小為128/4 = 32
修改
==#define MaxFileSize ((NumDirect+NumDirect2)*SectorSize) ==
之前單級索引是用數組的最后1位作為索引號,dataSectors[0]-dataSectors[28]作為存取數據的塊號;如果dataSectors[29]=-1,則表明沒有沒有二級索引塊,如果dataSectors[29]為任意正值,則與二級索引塊相應塊號對應,即dataSectors2[]值。文件超過dataSectors[]可存放大小,則放到dataSector2[]中,dataSectors2[]返回的Sector號對應著dataSectors[-1]的值。
文件讀取還是依照之前的方法,openFile里WriteAt()添加的AllocateSpace(),其中AllocateSpace()添加了filehdr的ExpandSpace()。只是需要修改讀數組dataSectors[]的方法,在讀到最后一位時,需要跳到dataSectors2里去繼續讀二級索引的數據內容。
關鍵源代碼注釋以及程序說明:
這是lab4里filehdr.cc里的Allocate():
但是現在需要判斷一些先需加入的扇區內容是否有超過文件大小范圍。如果沒超過,還是一級索引可以承受的;如果超過了,則需要用到二級索引。
如果沒超過文件內容,則和lab4基本一致, 將dataSectors[-1]設置為-1;超過文件內容則使用二級索引,先將dataSectors[-1]設置為,并設置dataSectors2的大小,把其他放不下的數據塊放到二級索引數組里。并把相應塊號設為一級索引的值。
Filehdr里的deallocate原來是這樣:
相應的deallocate需要修改:如果只有一級索引,則與之前無異;若有二級索引,則將dataSector[]數組內容清除,再清楚dataSectors2[]數組內容。
Lab4的ExpandSpace()是這樣的。
相應的加上dataSectors2的修改內容。
ByteToSector()和Print()也相應地添加上關于dataSectors2[]的內容。
調試記錄
./nachos -f
./nachos -D
./nachos -cp test/big big
./nachos -ap test/big big *5
但是當我繼續 ./nachos -ap test/big big 時就報錯了。
我也許是沒有真正實現二級索引,所以才會這樣。
發現之前一直沒有make,而且在makefile和makefile.local里面是filesys而不是lab5,因為filesys和lab5是同級文件,而且內部都有filesys.cc,所以會調用錯。需要修改成lab5。
發現其實在lab4里面也是調用的filesys,修改之后make再執行,如下。
Lab5修改后make再執行如下:
修改了輸出格式,想把一級索引對應的二級索引也寫出來。
做到現在,感覺對二級索引終于有了一點了解,對linux系統的debug也有了一點了解。
雖然現在最多可以擴展到68,但是還有個很詭異的事情,就是中間會報一次錯,但是之后又可以繼續擴展。很奇怪,待解決。
總結
以上是生活随笔為你收集整理的操作系统课设--具有二级索引的文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统课设--扩展文件系统
- 下一篇: 操作系统课设--系统调用