對(duì)ROMFS文件系統(tǒng)的分析和改進(jìn)
romfs_read_super()用來(lái)讀取ROMFS文件系統(tǒng)的首部,并利用該首部初始化一個(gè)超級(jí)塊對(duì)象作為相應(yīng)ROMFS的超級(jí)塊,具體流程如下
1 初始化超級(jí)塊。
A 設(shè)置一次讀取的塊大小并初始化超級(jí)塊對(duì)象某些域。
B 從指定ROMFS中讀取第0塊到一個(gè)緩沖區(qū)。bh=sb_bread(s, 0),其中s是文件系統(tǒng)的超級(jí)塊對(duì)象。ROMFS的文件系統(tǒng)結(jié)構(gòu)被保存到緩沖區(qū)bh中。
C 取出ROMFS的文件系統(tǒng)結(jié)構(gòu),rsb = (struct romfs_super_block *)bh->b_data,rsb是一個(gè)romfs_super_block結(jié)構(gòu),用以保存該ROMFS的文件系統(tǒng)結(jié)構(gòu)的數(shù)據(jù)。然后對(duì)該數(shù)據(jù)進(jìn)行檢驗(yàn),確定其文件系統(tǒng)類型,檢驗(yàn)和,文件系統(tǒng)大小。
D 繼續(xù)初始化超級(jí)塊對(duì)象某些域,比較重要的是s_magic = ROMFS_MAGIC和s_flags |= MS_RDONLY,分別表明了該超級(jí)塊的magic簽名和s_flags參數(shù),此處它們分別表示該文件系統(tǒng)類型為romfs,并且是只讀文件系統(tǒng)。
2 給超級(jí)塊對(duì)象的操作表賦值(s->s_op = romfs_ops)
3 為根目錄分配目錄項(xiàng) s->s_root = d_alloc_root(iget(s,sz), sz為文件系統(tǒng)開(kāi)始偏移。
超級(jí)塊操作表中romfs文件系統(tǒng)實(shí)現(xiàn)了兩個(gè)函數(shù)
static struct super_operations romfs_ops = {
read_inode: romfs_read_inode,
statfs: romfs_statfs,};
函數(shù)romfs_read_inode是從ROMFS中讀取一個(gè)inode索引節(jié)點(diǎn)對(duì)象并進(jìn)行一些初始化工作,具體流程如下:
1 根據(jù)inode參數(shù)尋找對(duì)應(yīng)的索引節(jié)點(diǎn)。
2 初始化索引節(jié)點(diǎn)某些域
3 根據(jù)該inode對(duì)應(yīng)的文件的訪問(wèn)權(quán)限和類別來(lái)設(shè)置索引節(jié)點(diǎn)的相應(yīng)操作表
A 如果是目錄文件則將索引節(jié)點(diǎn)操作表設(shè)為i_>i_op=romfs_dir_inode_operations;文件操作表設(shè)置為i->i_fop=romfs_dir_operations。
B 如果是常規(guī)文件,則將文件操作表設(shè)置為i->i_fop=generic_ro_fops;將頁(yè)高訴緩存表設(shè)置為i-> i_data.a_ops=romfs_aops;由于romfs是只讀文件系統(tǒng),它在對(duì)常規(guī)文件操作時(shí)不需要索引節(jié)點(diǎn)操作,如 mknod,link等,因此不用設(shè)置索引節(jié)點(diǎn)操作表。
對(duì)常規(guī)文件的操作也只需要使用內(nèi)核提供的通用函數(shù)表generic_ro_fops ,它包含基本的三種常規(guī)文件操作:
llseek: generic_file_llseek,
read: generic_file_read,
mmap: generic_file_mmap,
這幾種函數(shù)是塊設(shè)備讀取的通用函數(shù),它們可以實(shí)現(xiàn)對(duì)ROMFS中常規(guī)文件的讀取,尋址等操作。
C 如果是符號(hào)鏈接文件,則將索引節(jié)點(diǎn)操作表設(shè)置為
i->i_op = page_symlink_inode_operation;
page_symlink_inode_operations是通用的符號(hào)鏈接操作表。同時(shí)還需要實(shí)現(xiàn)頁(yè)高速緩
存操作,因此將頁(yè)高訴緩存表設(shè)置為i->i_data.a_ops=romfs_aops。
D 如果是套接字或管道則進(jìn)行特殊文件初始化操作init_special_inode(I,ino,nextfh);
函數(shù)romfs_statfs用于提取一些ROMFS的基本信息,包括文件系統(tǒng)大小,卷名等。相對(duì)而言非常簡(jiǎn)單。
5.對(duì)ROMFS的改進(jìn)
5.1 改進(jìn)思路
ROMFS有緊湊,小巧等優(yōu)點(diǎn),但是也存在一些明顯的不足。作為一個(gè)只讀的文件系統(tǒng),ROMFS的中文件最大只能達(dá)到256M。因此難以在 ROMFS中保存較大的文件。在實(shí)際工作中我們常常會(huì)碰到超過(guò)256M的大文件,因此本人對(duì)ROMFS做了一些改進(jìn),使它能夠容納超過(guò)256M的文件。
ROMFS中限制文件大小的原因在于ROMFS的文件結(jié)構(gòu)。ROMFS采用連續(xù)存放數(shù)據(jù)的策略,每個(gè)文件都必須放在連續(xù)空間內(nèi),故文件尋址只能是一級(jí)尋址,不能通過(guò)增減數(shù)據(jù)塊來(lái)改變文件大小。雖然ROMFS使用32位地址進(jìn)行文件的尋址操作,但該32位地址的后4位留做它用,因此ROMFS實(shí)際用于文件尋址的地址只有28位,這就造成ROMFS的任意兩個(gè)文件頭之間地址相差不能超過(guò)256M,這就是ROMFS中文件大小不能超過(guò)256M的原因。
評(píng)論