Root File System (RFS)根檔案系統也是一種“檔案系統”,可以認為是一種“特殊的”“檔案系統”,為什麼是叫“特殊的”呢?因為這種“根檔案系統”承載著某些“特殊的功能”(其實“檔案系統”相同的話,所具備的功能是一樣的),那就是“作業系統”可能需要通過某種“布局”來管理相關設備的,諸如軟碟設備、硬碟設備、虛擬磁碟設備等等,這裡可能就是用了一種已被定義好了“數據結構”的“布局”,即“檔案系統”,而出現的“根檔案系統”,可能是用來擔當主要或重要角色。
檔案系統:File System => FS;
根檔案系統:Root File System => RFS。
根檔案系統也是一種“檔案系統”,可以認為是一種“特殊的”“檔案系統”,為什麼是叫“特殊的”呢?是因為這種“根”“檔案系統”承載著某些“特殊的功能”(其實“檔案系統”相同的話,所具備的功能都是一樣的),那就是“作業系統”可能需要通過某種“布局”來管理相關設備的,諸如軟碟設備、硬碟設備、虛擬磁碟設備等等,這裡可能就是用了一種已被定義好了“數據結構”的“布局”,即“檔案系統”,而出現的“根檔案系統”呢可能是用來擔當主要或重要角色。
Windows下的C糟分區是有一定檔案系統的,如FAT32、NTFS,這當然也都是檔案系統呀。在安裝Windows作業系統時,會要求你先“格式化”C糟[當然我們目前考慮作業系統是被安裝在C糟中],採用一種“檔案系統”比如NTFS、FAT32等,這一步呀,就類似於安裝“根檔案系統”,也就是說在C糟中的NTFS檔案系統會被稱作是“根檔案系統”,而在D糟等中的NTFS檔案系統會被稱作是“檔案系統”或你想加上前綴名稱也不是不可以,比如“普通檔案系統”,而我們從名稱上來說的話,因為這裡出現了一個字眼“根”,所以我們就有兩種名稱的叫法了,自然就是FS與RFS,所以這種名稱叫法就會讓人感覺很是“雲裡霧裡”,而後“不知所云”的],這個“格式化”過程就是將C糟上的存儲空間呀按預先定義好的一種FS的“數據結構”去“初始化”這些磁碟,[這裡假設MINIX FS也可被Windows用來“格式化”C糟呀]比如建立引導塊、建立超級塊、建立兩類點陣圖塊、建立i節點點陣圖塊、建立好數據區塊等)也就是說,這個磁碟分區必須已經按一定數據結構的方式把磁碟空間“組織”好,以便“某種系統”(OS或FS,好象是FS更準確吧)能“訪問”該分區,所以在 0.11核心中會有兩種區分:mount_root() 和 sys_mount(),分別指“掛載根檔案系統”、“掛載檔案系統”[這裡我覺得不應該用一個詞:安裝!
我所理解的意思是,“安裝”就是指把某種東西“放”到另一種東西上面去,比如你要安裝某種軟體到C糟,這種軟體的安裝程式可能在D糟,這時你會啟動D糟上該軟體的安裝程式,然後安裝程式就會把軟體默認安裝到C糟上,所以這個過程會叫做“安裝”,安裝前C糟上沒有該軟體的任何信息,安裝後C糟上就會有該軟體的信息啦],所以呢,要使用sys_mount()功能,某種設備(具體來說就是某一分區)必須已經被某種FS的格式“安裝”好,然後該設備才會被“掛載”(mount)到“一個地方”去。
在0.11核心代碼中,從mount_root(void)中的注釋可知,該函式會被“系統調用函式”sys_setup()調用,而在系統開機初始化設定時函式sys_setup()會被調用。為什麼不會調用sys_mount()呢?那我們又何時使用sys_mount()函式呢?其實sys_mount()函式也是“系統調用函式”。我們在linux系統中,當你在某個shell的命令行中輸入mount後回車,你會看到以下提示信息:mount: usage: mount dev dir你大概應該清楚了,而這是“正確的提示信息”,因為我們用錯mount用法了(另外,在/bin目錄下,可以看到有mount這樣一個檔案,mount應該就是一個單獨的程式了吧:-),好多地方都說mount是shell內部命令,而我更可能會認為cd才是shell的內部命令之一)。
那我們從sys_mount()函式的注釋中可以知道,該函式是“安裝檔案系統調用函式”(我個人覺得這句話不太好理解),而我知道函式的功能,所以我會這么理解:這個函式是一“系統調用函式”,其功能是“將一個‘檔案系統’即FS‘掛載’到(現有‘根檔案系統’即RFS的)一個“目錄”上,即目錄檔案的i節點。所以呢,這個就與“mount dev dir”這樣的提示信息對應起來了;另外,我們需要知道,dev表示的是某個設備上的一個分區,而dir表示的是某一個“現有的”檔案系統中的“目錄檔案”,注意一定是“現有的”,在這裡就是我們說的“根檔案系統”,所以,你要使用mount功能,就得有以下條件:
在一個現有“檔案系統”(根檔案系統RFS)下面
該RFS中已經有了一些設備檔案的存在,比如 /dev 下面的 hd0,hd1,等等
2中的/dev其實就是由RFS來管理的
還需要有一個目錄存在,而該目錄也是在該RFS中的即由RFS來管理的
當然你要有實際的磁碟設備存在(/dev/hd0隻是表示一個“虛”的設備檔案名稱而已)且該設備已被“FS”格式化好了
最後你就會用mount dev dir這樣的方式,將實際的磁碟分區“掛載”到dir中
假如,你有一個硬碟(假設大小是512MB),就只是一個分區,該分區中的FS是 FAT FS(假設unix可以直接訪問,大不了看成是與minix fs是一樣的,只是名稱不同而已,以下就是把它看成就是一個minix fs來分析的)。
所以當你啟動了“0.11系統”(這個說法比較簡化,意思就是你進入了sh命令行)後,其實RFS就已經被“自動”“掛載”好了(就是mount_root()),這時,你需要在該“0.11系統”中訪問那個硬碟,假設硬體上你已經安裝好了硬碟了,然後你會在sh命令行中進行“安裝”過程了,假如是:
mount /dev/hd0 /mnt/fatc
即將第一個硬碟的第一個分區(目前只有一個分區)“掛載”到“RFS”中的根目錄下的mnt目錄中的fatc目錄上。所以,你可以直接“進入”到 fatc 目錄中去訪問該硬碟里的檔案了。
因為你了解核心代碼,所以你應該知道mount一系列過程的,你要知道以下幾點:
/dev/hd0, /mnt/fatc都是RFS中的“檔案”(統稱),前者是設備檔案,後者是目錄檔案。
[體現在i節點結構中,就是各自的inode->i_mode中會區分是“設備類型檔案”還是“目錄類型檔案”,且前者的inode->zone[0]存有該設備的設備號(還有inode->i_dev也是設備號,但實際含義不一樣),後者的inode->i_mount就被置位啦,注意因為這個i節點就是一個“被‘安裝’/‘掛載’好了FS的i節點。/ 這是目錄,但這個是RFS的目錄,且是根目錄。
/mnt/fatc “相當於”就是那個硬碟分區中FS的根目錄。但其實該硬碟中的根目錄也是/。
[假設當你去訪問那個分區“根”目錄(其實也是/,但你能直接進去嗎?)中的某個檔案hello.c,時,你會在現有sh命令行中,cd /mnt/fatc回車後 ls hello* -l,然後你會發現有hello.c這個檔案,其實你就應該需要知道RFS是怎么“定位”尋找到該hello.c檔案的,當中有一個重要的過程就是需要取每一個檔案的inode信息即iget()函式,該函式中發現某檔案的inode->i_mount被置位時,就“特別小心”了,為什麼?因為該inode表示被“掛載”了一個檔案系統,所以RFS會“切換”到那個FS的根目錄中去(使用了ROOT_INO,super_block[i].s_dev這樣的參數),然後再在該FS中按正常的過程繼續尋找所需要的檔案,所以你能找到]“正常的過程”就是指:要么從一個FS的根目錄中開始查找檔案,要不從一個檔案系統當前用戶進程的當前工作目錄中開始查找檔案。所以就有一個重要的說法(我是這么理解的):跨檔案系統訪問檔案。這一過程涉及面較廣,主要數據結構有:i節點、超級塊。
最後,當你不需要使用該分區或是你想把硬碟拿走,則你會使用 umount 功能啦,這就對應 sys_umount()這一“系統調用函式”,那你就要知道該函式做了些什麼事了。
mount_root()掛載了一個MINIX FS又被稱為是RFS。
然後你可以在該RFS中再掛載別的FS。RFS與系統“共存亡”,自動被“掛載”,自動被“卸載”。
所以,FAT等也可以是根檔案系統,當然也是檔案系統。
所以,當你在你電腦上安裝了多作業系統時,假設在C糟(FAT32 FS)被裝了 win98,在D糟(NTFS FS)被安裝了winxp,那么,當你進入了win98時,你FAT32好象就是RFS,那么NTFS就是FS了;當你進入了winxp時,NTFS好象就是RFS,那么FAT32就是FS了。