最近我看了一點關於文件系統的書,操作系統概念,深入理解linux內核等,對linux的文件系統有了大概的了解。就是在VFS下實現各個函數。可是,在具體到怎麼寫代碼,怎麼測試這裡一點頭緒都沒有了。比如,先寫那部分,是掛載函數?還是inode節點。怎麼測試自己寫的對還是錯也不理解。用過vim,c語言程序功底也還有。就是對linux內核級的編程沒有經驗。應該怎樣實現,希望能得到具體的描述。


不如先去讀一個現在 Linux 內核里文件系統的源碼再說。如果是對文件系統設計有興趣,而對 Linux 內核開發技術儲備不足,可以用 fuse 在用戶態做一個試試看。


曾經在自己的內核里簡單實現過minix v1文件系統,因為自己的內核比較小,掛掉就重啟虛擬機還算比較快,所以在調試中反覆重啟用printk調試也還算不上太痛苦。現在想來,花功夫最多的函數其實只有bmap()與namei()這兩個函數,其它的文件系統操作,大多就只剩下對它倆的包裝了。

至於在linux中的文件系統就比較慚愧了,仍未動手實戰過。不過linux的話有kgdb可以用,調試也不一定會太痛苦。

同 @謝然 的建議,文件系統在開始階段完全可以放在用戶態來開發及測試,這也是BeOS在開發文件系統時的經驗。依賴的底層api只需要aquire/release/讀/寫磁碟塊就足夠了,這幾個api都很容易在用戶態中模擬。

此外有兩個很有用的工具不得不提一下:
  1. loopback設備: 它可以將一個普通文件映射為一個塊設備。

  2. fsck是天然的自動化測試。

Good Luck
我曾經自己寫過兩個 當然只是娛樂性質的 我的做法是先找最簡單的當例子 先不操作硬碟 只操作內存 然後逐漸加東西

我也跟著 fleuria 實現了一個 Minix 文件系統。不過同樣也是實現在自己的玩具內核中的。

建議讀一讀 xv6 的文件系統部分(第六章 文件系統),儘管它實現的不是 Minix,可是兩者相差不多,要將 xv6 中的代碼改成 Minix 的,可以參考下我的文章:Minix v1 文件系統的實現。

對於用戶態的話,只要將驅動層面上的 iderw() 換成對虛擬磁碟文件的讀寫就好了。上層代碼幾乎不需要更改。


個人覺得Linux 經典的文件系統 minix/ext2/ext3 你去看他們的源碼,尤其是早期的,你會發現其實都是差不多的[都是在原來的基礎改的]

如果你自己實現一個,單純的為了學習的話,其實可以參照minix寫個簡單的。

另外我覺得其實你自己寫個其實也沒有多大意義,直接投入到現在ext4/btrfs/xfs的維護中去不是更好。

題主可以先不涉及linux的內核操作,因為上來就這麼做,難度太大。可以循序漸進,先把文件系統組織/管理文件的功能實現,體驗文件系統的精髓,寫一個去除底層驅動的文件系統。

具體做法是:系統由本地文件承載,以文件讀寫代替磁碟讀寫

我剛上傳了一個仿linux虛擬文件系統,給題主參考: windcode/os_filesystem

我是在windows下實現的,不過忽略底層驅動的話,道理是一樣的。


雖然是好幾年前的問題了,最近在寫一個minix v1鏡像的讀寫工具,說說自己的心得吧。把鏡像看成一個有n個1024位元組長度的大數組typedef char (*img_t)[1024],這樣bread bwrite就可以模擬做邏輯塊讀寫,再上層就是索引節點 邏輯塊分配 回收函數,再上層就是文件 目錄的讀寫,這裡關鍵的一個函數是bmap也就是文件偏移處數據所在的邏輯塊。
寫個wrapfs,可以加深理解。用戶態用fuse也很不錯。
推薦閱讀:
相关文章