建立文件系统
【0】README
0.1) source code and text description are from orange’s implemention of a os and for complete code, please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/orange_s_fs.tar;
0.2) 此文件系統(tǒng)涉及到的數(shù)據(jù)結(jié)構(gòu) 僅僅針對于 orange’s OS, 并不是linux等 *nix 的官方file system data structure ;該文件系統(tǒng)僅僅作為 學(xué)習(xí)*nux 文件系統(tǒng)的鋪墊;
0.3) 由于, 我的硬盤大小為80M 不方便上傳, 故還請訪客自行創(chuàng)建虛擬硬盤, (如何創(chuàng)建虛擬硬盤,參見http://blog.csdn.net/pacosonswjtu/article/details/48846887 , 如何建立硬盤分區(qū)表,參見 http://blog.csdn.net/pacosonswjtu/article/details/48846763)
0.4) 建立文件系統(tǒng)代碼的目錄樹:
0.5) 文件系統(tǒng)結(jié)構(gòu)圖如下:
【1】我們看 建立文件系統(tǒng)的代碼是如何調(diào)用的?
- 上述代碼中的task_fs() , 它調(diào)用函數(shù) init_fs(),而init_fs() 在打開ROOT_DEV 之后調(diào)用了mkfs(),這便是建立文件系統(tǒng)的函數(shù)了;
【2】關(guān)于mkfs建立文件系統(tǒng)代碼分析
2.1)mkfs代碼有這么幾個部分:
- part1)向硬盤驅(qū)動程序 索取 ROOT_DEV的起始扇區(qū)和大小;
- part2)建立超級塊-super block;
- part3)建立 inode-map;
- part4)建立 sector-map;
- part5)寫入 inode_array;
- part6)建立根目錄文件;
2.2) 文件系統(tǒng)內(nèi) 的 inode 數(shù)目上限是多少?
我們決定最多允許有 4096個inode, 這樣只需要一個扇區(qū)來做inode-map就可以了(4096==一個扇區(qū)的bits 數(shù)目)。這個決定同時意味著我們的file system 最多容納 4096個文件;
2.3) 在ms_fs()中, 所有寫入磁盤的內(nèi)容都是先放進fsbuf 這個緩沖區(qū)的,我們定義了一個指針,讓它指向 0x600000:
也就是說,我們指定內(nèi)存地址 6M~7M 為文件系統(tǒng)的緩沖區(qū),一定程度上,這算是一種低級形態(tài)的內(nèi)存管理吧;
2.4) mk_fs()寫好了,我們看一下運行效果:
【3】根據(jù)以上輸出,我們看一下 磁盤中的實際內(nèi)容:
3.1)超級塊開始于 0x9E0000(占用一個扇區(qū)512個字節(jié),實際用56個字節(jié)):
xxd -u -a -g l -c 16 -s 0x9E0000 -l 512 80m.img
Attention):超級塊 的 結(jié)構(gòu)體成員 int sb_dev 在硬盤上是不存在的,僅針對我們的orange’s os 而言, 所以超級塊的結(jié)構(gòu)體大小為56 bytes;
3.2) inode-map開始于 0x9E0200(占用1個扇區(qū)512個字節(jié)):
xxd -u -a -g l -c 16 -s 0x9E0200 -l 512 80m.imgAnalysis):
bit0:reserved,保留; bit1:指向根目錄'/' 的(根目錄文件時數(shù)據(jù)區(qū)的第一個文件)inode; bit2:指向 /dev_tty0 的inode; bit3:指向 /dev_tty1 的inode; bit4:指向 /dev_tty2 的inode;
A1)分配一個扇區(qū)==512字節(jié)==4096 bits == 可以記錄4096個inode 的使用情況哦;
A2)顯然 0x1F==00011111,也即前5個inode 已經(jīng)被使用了;A3): dev_tty[0,1,2] 三個文件稱為 字符設(shè)備特殊文件,暫且創(chuàng)建,后續(xù)可能使用;
3.3) sector-map開始于 0x9E0400(sector-map占用扇區(qū)數(shù)依據(jù)該硬盤總扇區(qū)數(shù)決定):
xxd -u -a -g l -c 16 -s 0x9E0400 -l 512 80m.img- Analysis)
A1)由 超級塊super block 可知,硬盤的扇區(qū)總數(shù)為 0x9D41 = 40257 sectors ;
A2)又一個bit位映射一個扇區(qū)的使用情況(1已被使用,0未被使用) ,所以40257 /8 =5032(大約)Bytes = 大約10個扇區(qū)左右;
A3)從上圖,我們看到,有2049個扇區(qū)被使用了;
A4)又, 0x9E1800 - 0x9E0400 = 0x1400,所以中間的字節(jié)數(shù)=16^3 + 4*16^2=4096 + 1024 = 5120 bytes (約等于 5032bytes ,呵呵,大致正確啦)
3.4)inode-array開始于 0x9E1800(每個inode數(shù)據(jù)結(jié)構(gòu)大小=32bytes):
xxd -u -a -g l -c 16 -s 0x9E1800 -l 512 80m.img
- Analysis)
A1)這就是具體的inode 數(shù)據(jù)結(jié)構(gòu)信息的存儲空間啦;
A2)由圖,以及根目錄文件開始于 0xA01800,我們知道 0xA01800 - 0x9E1800 = 0x20000 = 2^17 bytes
A3)又,每個inode=32bytes, 所以依據(jù)以上數(shù)據(jù),算出實際的inode = 2^12 =2048 個inode = 2048個文件;
3.5)根目錄文件開始于 0xA01800(每個根目錄dir_entry數(shù)據(jù)結(jié)構(gòu)大小為16 bytes):
xxd -u -a -g l -c 16 -s 0xA01800 -l 512 80m.img
總結(jié)
- 上一篇: 电脑FN键在哪(电脑fn键在哪里设置)
- 下一篇: 在diy的文件系统上创建文件的流程