romfs和rootfs概念上有所區別

 

romfs和rootfs概念上有所區別

flash在內存中的的起始地址爲0x46000000,而ROMFS在flash分區上的起始位置爲0x00040000,所以ROMFS在內存地址 中的位置就爲0x46040000。這個細節的部分可以參考flash分區時的地方,Creating 3 MTD partitions。 

romfs中包括kernel和app應用,不包括bootloader和firmware信息頭。romfs只讀文件系統裏的內容有很多種分類方法, 我們可以將kernel和app同時放裏面,作爲根文件系統下的一個文件,也可以在flash上另外劃分區域來分別存放。 

VFS虛擬文件系統交換器 

在linux系統中,目前已經開發出多種文件系統,那麼如何讓這些文件系統能共存在一個系統中呢,從linux 2.0開始,引入了虛擬文件系統管理器 VFS的概念。

Linux 下的文件系統主要可分爲三大塊: 

① 一是上層的文件系統的系統調用, 

② 二是虛擬文件系統交換器 VFS(Virtual Filesystem Switch), 

③ 三是掛載到 VFS 中的各實際文件系統,例如 ext2,jffs 等。 

VFS的確切叫法是Virtual Filesystem Switch虛擬文件系統交換器,這裏的VFS中的“S”是指的switch,這個需要強調一下的,它很容易被混淆成“system”,如果理解成“system”將是不正確的,請多加註意。 

VFS是具體文件系統filesystem的一個管理器。


VFS是Linux內核中的一個軟件層,一種軟件機制,它也提供了內核中的一個抽象功能,允許不同的文件系統共存,可以稱它爲 Linux 的文件系統管理者,與它相關的數據結構只存在於物理內存當中。所以在每次系統初始化期間,Linux 都首先要在內存當中構造一棵 VFS 的目錄樹。VFS 中的各目錄其主要用途是用來提供實際文件系統的掛載點。而rootfs將是這個目錄樹的根結點的(root),即 "/"目錄,VFS的結構就是從這個rootfs開始的。有了VFS,那麼對文件的操作將使用統一的接口,將來通過文件系統調用對 VFS 發起的文件操作等指令將被 rootfs 文件系統中相應的函數接口所接管。 

注意:rootfs並不是一個具體的文件系統類型,如jffs。它只是一個理論上的概念。在具體的嵌入系統實例中,可以將某種具體的文件系統設置爲根文件系統rootfs,如我們可以設置romfs爲根文件系統,也可以設置jffs爲根文件系統。 

這裏的ROMFS只讀文件系統只是一種具體的文件系統類型,也是在嵌入系統中經常使用到的類型。 

看完了上面的內容,以後你對出現的類似“kernel Panic:VFS:Unable to mount root fs on 0:00”的含義應該已經瞭解了。其中“VFS:”就是虛擬文件系統管理器操作時的輸出信息了。

 

 

關於Linux啓動時掛載rootfs的幾種方式

 

  1、Linux啓動時,經過一系列初始化之後,需要mount 根文件系統,爲最後運行init進程等做準備,mount 根文件系統有這麼幾種方式:

  1)文件系統已經存在於硬盤(或者類似的設備)的某個分區上了,kernel根據啓動的命令行參數(root=/dev/xxx),直接進行mount。 這裏有一個問題,在root文件系統本身還不存在的情況下,kernel如何根據/dev/xxx來找到對應的設備呢?注意:根文件系統和其他文件系統的mount方式是不一樣的,kernel通過直接解析設備的名稱來獲得設備的主、從設備號,然後就可以訪問對應的設備驅動了。所以在init/main.c中有很長一串的root_dev_names(如hda,hdab,sda,sdb,nfs,ram,mtdblock……),通過這個表就可以根據設備名稱得到設備號。注意,bootloader或內核中設定的啓動參數(root=/dev/xxx)只是一個代號,實際的根文件系統中不一定存在這個設備文件!

  2)從軟驅等比較慢的設備上裝載根文件系統,如果kernel支持ramdisk,在裝載root文件系統時,內核判斷到需要從軟盤(fdx)mount(root=/dev/fd0),就會自動把文件系統映象複製到ramdisk,一般對應設備ram0,然後在ram0上mount根文件系統。 從源碼看,如果kernel編譯時沒有支持ramdisk,而啓動參數又是root=/dev/fd0,系統將直接在軟盤上mount,除了速度比較慢,理論上是可行的(沒試過,不知道是不是這樣?)

  3)啓動時用到initrd來mount根文件系統。注意理解ramdisk和initrd這兩個概念,其實ramdisk只是在ram上實現的塊設備,類似與硬盤操作,但有更快的讀寫速度,它可以在系統運行的任何時候使用,而不僅僅是用於啓動;initrd(boot loaderinitialized RAMdisk)可以說是啓動過程中用到的一種機制,具體的實現過程也使用ramdisk技術。就是在裝載linux之前,bootloader可以把一個比較小的根文件系統的映象裝載在內存的某個指定位置,姑且把這段內存稱爲initrd(這裏是initrd所佔的內存,不是ramdisk,注意區別),然後bootloader通過傳遞參數的方式告訴內核initrd的起始地址和大小(也可以把這些參數編譯在內核中),在啓動階段就可以暫時的用initrd來mount根文件系統。initrd的最初的目的是爲了把kernel的啓動分成兩個階段:在kernel中保留最少最基本的啓動代碼,然後把對各種各樣硬件設備的支持以模塊的方式放在initrd中,這樣就在啓動過程中可以從initrd所mount的根文件系統中裝載需要的模塊。這樣的一個好處就是在保持kernel不變的情況下,通過修改initrd中的內容就可以靈活的支持不同的硬件。在啓動完成的最後階段,根文件系統可以重新mount到其他設備上,但是也可以不再 重新mount(很多嵌入式系統就是這樣)。initrd的具體實現過程是這樣的:bootloader把根文件系統映象裝載到內存指定位置,把相關參數傳遞給內核,內核啓動時把initrd中的內容複製到ramdisk中(ram0),把initrd佔用的內存釋放掉,在ram0上mount根文件系統。從這個過程可以看出,內核需要對同時對ramdisk和initrd的支持(這種需要都編入內核,不能作爲模塊)。

  2、嵌入式系統根文件系統的一種實現方法:對於kernel和根文件系統都存儲在flash中的系統,一般可以利用linux啓動的initrd的機制。具體的過程前面已經比較清楚了,還有一點就是在啓動參數中傳遞root=/dev/ram0,這樣使得用initrd進行mount的根文件系統不再切換,因爲這個時候實際的設備就是ram0。還有就是initrd的起始地址參數爲虛擬地址,需要和bootloader中用的物理地址對應。

發佈了14 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章