106 OS homework 2-2 成果報告書

組長:A10615005 包含
組員:A10615004 曾偉傑

github: https://github.com/acginf/xv6-public


🙂 使用情境說明(包含流程圖)

修改本作業系統的文件支持結構
源文件系統是單次尋找地址,現在我們把這個點進行修改。添加一些功能,將原來的單次尋找地址修改為二次或多次尋找地址,以此希望能夠讓我們的文件系統保存一個較為大體積的單一文件。
文件結構

流程圖

fs.c檔

big.c檔

(更正:上圖中所有的平行四邊形均為矩形)


😇 成功畫面

測試big命令

測試完整流程


🏃 實作過程(修改哪些檔案[含圖片])

實做要點:
因為本機配置不足以運行虛擬機,所以我另外購買了遠程vps作為本項目的實做機器,并安裝了Ubuntu14(64位)系統。

遠程伺服器正在安裝系統

登錄成功

執行sudo apt-get update

執行sudo apt-get install build-essential

執行sudo apt-get install gcc-multilib

執行sudo apt-get install qemu

執行sudo apt-get install git

git clone https://github.com/asanka-code/xv6.git
cd xv6

安裝xv6作業系統前的一些環境配置。
確保Makefile中QEMU = qemu-system-x86_64

sudo make&sudo make qemu

打開Makefile并修改

添加行 big\ 在UPROGS中 增加函數支持

減少CPUS的值

修改行添加snapshot選項,nographic选项,防止qemu生成圖形窗口,以免在SSH因為無法啟動GUI報錯。

添加c檔名稱

至此Makefile檔修改完畢

修改file.h

增加0級地址塊用作二次尋址

修改fs.h

在我們新定義的文件系統中,0級地址塊已經有兩個作為間接尋址使用。所以直接尋址的地址範圍需要從12縮小到11。NINDIRECTLEVERLTWO是二次間接尋址的擴展範圍,而MAXFILE也需要加上這個範圍。

修改fs.h

添加代碼
我們定義NINDIRECT * NINDIRECT為二次尋址最大值,而bn的剩餘值顯然不能超過這個數值。可能會遇到內存未分配的情況,在需要計算從索引位置到結束的地址差后,這段代碼可以分配工作。

新建big.c檔


修改mkfs.c檔中nblocks,nlog,ninodes,size的值

將文件拷貝到linux中執行make && make qemu運行

測試big命令

完整流程


😎 結論

在xv6中,文檔系統被設計成只有一次間接尋找地址,將它修改二次尋找地址將會使得原來的系統具備接受大文檔的能力。我們嘗試減少一個指針將它用於二次尋找地址。這樣使得原來的一次尋找地址塊上移。
我們也需要考慮如何使用邏輯塊編號為雙向二次間接塊和它指向的索引。我們改變了NDIRECT的定義,同時在file.h的struct inode中改變了addrs的大小。確保struct inode和struct dinode在addrs數組中具有相同數量的元素。需要分配二次塊和二次指針塊,如原始bmap()。二次尋找地址數據塊的儲存元組被看做是二次尋址地址將其一次尋找地址到的數據塊。
通過我們的編程實做和測試結果來看,我們的xv6具備了接納大文件的能力。


📅 組員分工

A10615005 包含 修改文檔fs.c,創建文檔big.c,修改Makefile,xv6安裝與測試以及文檔編寫。
A10615004 曾偉傑 修改文檔log.c,fs.h,file.h,param.h并參與討論。