亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1136 | 回復(fù): 0
打印 上一主題 下一主題

ROMFS文件系統(tǒng)分析[三]ROMFS映像文件結(jié)構(gòu) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-04-18 22:18 |只看該作者 |倒序瀏覽

                上一節(jié)(
http://blog.chinaunix.net/u2/73528/showart.php?id=1903687
)說的是romfs的超級塊結(jié)構(gòu)(struct romfs_super_block),下面主要介紹romfs的inode結(jié)構(gòu)(struct romfs_inode)。
   眾所周知,在文件系統(tǒng)中,我們都會提到inode節(jié)點。那么對于romfs文件系統(tǒng),是否也有inode節(jié)點?如果有,那是否也向EXT2等如此龐大復(fù)雜?
對于第一個問題,我們的回答是“是”,第二個回答是“否”。romfs設(shè)計的初衷就是構(gòu)建一個最小內(nèi)核。為了達到目的,我們是一切從簡。越簡單其自身就越小,越能提高空間的利用率;越簡單處理起來效率就越高。所以romfs的inode也和其超級塊結(jié)構(gòu)一樣,非常簡單:
               
               
                /* On disk inode */
struct romfs_inode {
        __be32 next;            /* low 4 bits see ROMFH_ */
        __be32 spec;
        __be32 size;
        __be32 checksum;
        char name[0];
};
初看,似乎和其超級塊結(jié)構(gòu)一樣,都有5個域。結(jié)構(gòu)本身大小也一樣(都為16字節(jié))。實際上,在生成romfs映像的工具genromfs中,就是使用一個結(jié)構(gòu)(struct romfsfh)來代表這兩個結(jié)構(gòu)的,之所以分開,是因為其代表的對象不同。romfs_super_block代表整個romfs文件系統(tǒng),而romfs_inode只代表文件。雖然兩個結(jié)構(gòu)一樣,但個個域的含義是不一樣的。下面我們一一講解。
1. next域  該域是非常重要的一個字段。因為整個romfs映像中的文件頭最少都對齊在16字節(jié)邊界上,也就是說其在romfs映像文件中的偏移的低四位一定為0。所以我們正還利用這4位來做些什么。
romfs文件系統(tǒng)使用其低4位來表示文件類型和文件的權(quán)限,具體分配為:[0:2]共3位和起來表示文件類型,可見在romfs文件系統(tǒng)中,支持的文件類型有8中,具體有:
               
                #define ROMFH_HRD 0     /* 硬鏈接文件 */
#define ROMFH_DIR 1     /* 目錄文件 */
#define ROMFH_REG 2     /* 普通文件 */
#define ROMFH_LNK 3     /* 鏈接文件 */
#define ROMFH_BLK 4     /* 塊設(shè)備文件 */
#define ROMFH_CHR 5     /* 字符設(shè)備文件 */
#define ROMFH_SCK 6     /* 套接字文件 */
   第4位表示文件是否有可執(zhí)行權(quán)限。如果其他用戶具有讀寫執(zhí)行權(quán)限,并且文件是一個目錄或者普通文件,則給文件加上可執(zhí)行權(quán)限。硬鏈接文件不具有可執(zhí)行權(quán)限。將next域的低4位置0就是下一個文件在romfs中的偏移。romfs正是通過這個域?qū)⑺形募M織起來的。
   這里還有一個小小的問題。在網(wǎng)上看到許多關(guān)于romfs的文章,說romfs文件系統(tǒng)使用next域的高28位來尋址下一個文件,所以romfs文件系統(tǒng)支持的最大的映像為256M。還有人經(jīng)過理論,使用name域的一些空間和next域聯(lián)合起來,使romfs文件系統(tǒng)支持大于256M的文件。這個說法是完全錯誤的。最好的證據(jù)就是你直接拖幾個五六百兆的電影,然后使用genromfs工具看其是否能生成romfs映像;如果能生成,使用mount命令掛載,看其是否掛載上;如果能掛載上,你可以使用cp命令將大于256M的電影文件拷出來,使用diff命令和原來的電影文件對比一下,看是否一樣。在我的機子上,這些假設(shè)都成立。這并非偶然,我們可以從最最本質(zhì)的代碼角度繼續(xù)證實這一點.
2. spec域   初識romfs的時候,這個域我困惑了好久,不知道它和next域表示的文件類型到底有什么聯(lián)系和區(qū)別,看內(nèi)核文檔(Documention/filesystem/romfs.txt)的時候也是沒弄明白。經(jīng)過這些天的分析,現(xiàn)在終于弄明白了。如果你也在學(xué)習(xí)romfs文件系統(tǒng),希望對你有幫助。
這個域是文件類型相關(guān)的,也就是說對于不同的文件類型,這個域表示的含義是不一樣的。
(1).對于硬鏈接文件(next & 0xf = 0),這個域的值為其指向的文件的偏移。
(2).對于目錄文件(next & 0x1 = 1),這個域指向其內(nèi)第一個文件的文件頭
    在romfs映像中的偏移。
(3).對于普通文件(next & 0x2 = 2),鏈接文件(next & 0x3 = 3)
    ,SOCKET文件(next & 0x6 = 6)和管道文件(next & 0x7 = 7),這
    個域一定為0,這一點可以從genromfs工具代碼的角度證明(具體見
    dumpnode函數(shù),我們在后面還會詳細分析)。
(4).對于塊設(shè)備文件(next & 0x4 = 4)和字符設(shè)備文件(next & 0x5 = 5)
   ,這個域的高16位為設(shè)備文件代表的設(shè)備的主設(shè)備號,低16位為次設(shè)備號。
3. size域   該域表示文件的大小。文件內(nèi)容是16字節(jié)對齊的。如果文件的末尾不夠16字節(jié),則使用0填充.
4. checksum域和romfs_super_block結(jié)構(gòu)不同的是,這個域只是文件頭和文件名的校驗和。


本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/73528/showart_1903693.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP