天天看點

通過ramdisk核心子產品研究Linux檔案系統

在《深入Linux裝置驅動程式核心機制》第11章"塊裝置驅動程式” 11.2節當中給出了ramdisk的兩個版本的實作,這個示例的目的除了讓讀者直覺感受一下編寫一個塊裝置驅動程式的大體架構和關鍵元素之外,還特别提到“這個例子還有一個非常重要的潛在用途,那就是通過ramdisk來研究Linux的檔案系統,比如ext3等,因為mkfs.ext3工具會将ext3檔案系統做到這個ramdisk中,這意味着ext檔案系統家族的超級塊、組描述符、資料位圖、inode位圖和inode表等一系列的重量級資料結構會被記錄到ramdisk中,我們可以通過另外的方式去讀/寫這段RAM空間來獲得現場的資料,這對了解Linux中ext檔案系統家族的源代碼是非常有幫助的...”,當時因為書的進度以及考慮到檔案系統方面的内容跟書的主題并沒有直接的關聯,是以并沒有做實際的嘗試。。。

最近我在ramdisk的源碼基礎上将sdisk變量給export了出來:

01.char *sdisk[RAMHD_MAX_DEVICE] = {NULL,};

02.EXPORT_SYMBOL_GPL(sdisk);

然後又重新寫了另一個核心子產品ram_ext3,在這個子產品中我會利用前面那個ramdisk子產品導出的sdisk變量來獲得ramdisk上ext3檔案系統的超級塊等資料,因為時間的關系我隻做了個原型,在ram_ext3子產品的初始化函數中列印ext3 super block的一些資料,尤其是其中的s_magic成員(EXT3_SUPER_MAGIC = 0xEF53),這樣可以驗證所讀出的資料是否是我們所需要的東西。如果讀者對ext3的核心源碼感興趣,可以在ram_ext3的基礎上進行擴充,以友善觀察在某些檔案操作之後ext3系統中資料的變化。

這個示例的操作步驟我簡單描述一下:

1. 将ramdisk核心子產品加入系統 insmod ramhd_mkreq.ko,成功之後将在/dev目錄下産生兩個裝置檔案節點/dev/ramhda和/dev/ramhdb

2. 我隻使用其中的/dev/ramhda,在上面用mkfs.ext3指令生成ext3檔案系統,指令輸出截屏如下(點選放大):

通過ramdisk核心子產品研究Linux檔案系統

3. 步驟2中的輸出當中有幾個重要的資料: Block size = 1024, First data block=1,是以ext3的檔案系統super block放置在第一個block上,換句話說是sdisk[0]所在位址再加上1024才是ext3檔案系統的資料,是以ram_ext3核心子產品初始化函數得做如下處理 ---

01.extern char *sdisk[2];

02.static int __init ramext3_init(void)

03.{

04. //EXT3_SUPER_MAGIC = 0xEF53

05. struct ext3_super_block *sb;

06. unsigned long tmp = (unsigned long)sdisk[0];

07. tmp += 1024;

08.

09. sb = (struct ext3_super_block *)tmp;

10. //printk("sdisk = %p\n", sdisk[0]);

11. printk("s_magic = 0x%X, s_inodes=%d, s_blocks=%d\n", sb->s_magic, sb->s_inodes_count, sb->s_blocks_count);

12. printk("s_blocks_per_group = %d, s_log_frag_size=%d, s_inodes_per_group=%d\n", sb->s_blocks_per_group, sb->s_log_frag_size, sb->s_inodes_per_group);

13. return 0;

14.}

4. 把ram_ext3.ko加入系統 insmod ram_ext3.ko,然後看到dmsg的輸出截屏如下(點選放大):

通過ramdisk核心子產品研究Linux檔案系統

可以看到檔案magic值為s_magic = 0xEF53, inode數量是s_inodes=2048, block塊數量是s_blocks=8192,...,這些資料都與我們當初在/dev/ramhda上建立ext3時mkfs.ext3工具所輸出的資料相吻合。

對ext3感興趣的同學可以繼續利用這裡的試驗去挖掘自己所需要的東西。最後我将ramdisk和ram_ext3核心子產品的源碼作為附件放在這裡。。。

繼續閱讀