天天看點

編寫一個UNIX檔案系統

近日有人求助,要寫一個UNIX檔案系統作為暑假作業。這種事情基本是學作業系統的必須要做的或者是做過的,畢竟檔案系統是作業系統課程的一個重要組成部分。要實作這個UNIX檔案系統,很多人就紮進了UNIX V6的的系統源碼,以及《萊昂氏UNIX源代碼分析》和《返璞歸真:UNIX技術内幕》這兩本書,很多人出來了,很多人在裡面迷失了...最終忘了自己隻是要實作一個UNIX檔案系統而已。

       為何會迷失,因為代碼不是自己寫的,而且年代久遠,程式設計理念不同了,作者為何那樣寫不一定就能了解,實際上對于任何别人寫的代碼,總是會有一些不易了解的地方,當然,如果作者水準超級高,那麼代碼也就相對容易了解。是以,寫代碼永遠比讀代碼要容易!既然是要寫一個檔案系統,為何要用現成的UNIX V6代碼呢?如果了解了UNIX檔案的布局和結構,自己從零開始不參考任何現有的代碼做一個也不是什麼難事,最根本的是UNIX檔案系統本身,至于說代碼,僅僅是一個實作與使用者操作的一個接口而已。如果代碼是自己一點一點寫的,那麼你肯定能徹底明白每一行的每一個語句的精确含義,至于為何這麼寫,你當然及其明了!

       本文留下我倉促間幾個小時寫的一個類UNIX檔案系統的代碼,不是讓别人看的,是為了自己留檔,因為本文已經說了,看别人的代嗎隻能學習經驗,不能了解本質,更何況,你看的還得是超級一流的代碼,而我寫的,則是超級垃圾的代碼。我隻想說,了解問題的本質要比代碼重要得多,代碼,碼,并不是很多人想象中的那般重要!本文的實作基于Linux系統,即在Linux系統上編寫一個使用者态程式,實作UNIX檔案的IO接口以及操作。

       我一向堅持的原則,那就是任何東西的根本性的,本質上的原理以及背後的思想都是及其簡單的,所謂的複雜性都是優化與政策化的擴充帶來的,正如TCP一樣,UNIX的檔案系統也不例外!我們必須知道,什麼是最根本的,什麼是次要的。對于UNIX檔案系統,最根本的就是其布局以及其系統調用接口,一個處在最低層,一個在最上層開放給使用者,如下所示:

系統調用接口:open,write,read,close...

檔案系統布局:引導快,超級塊,inode區表,資料塊區

所有的在二者中間的部分都是次要的,也就是說那些東西不要也行,比如高速緩沖,高速緩存,VFS層,塊層...是以在我的實作代碼中,并沒有這些東西,我所做到的,僅僅是UNIX檔案系統所要求必須做到的最小集,那就是:

面對一個按照UNIX檔案系統标準布局的“塊裝置”,可以使用open,read,write等接口進行IO操作。

在實作中,我用一個标準的Linux大檔案來模拟磁盤塊,這樣塊的操作基本都映射到了Linux标準的write,read等系統調用了。

首先定義必要的結構體:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

繼續閱讀