嵌入式linux啓動信息註釋之bootloader
作爲一名嵌入系統開發者,你一定遇到過下面的情景:
在某論壇上看到一篇帖子,上面貼着嵌入式linux開發板啓動時的有關信息,然後大家在帖子裏討論着這個啓動過程中出現的問題,隨機舉例如下:
- Linux version 2.4.20-uc0 (root@Local) (gcc version 2.95.3 20010315 (release) (ColdFire patches - 20010318 from http://f
- (uClinux XIP and shared lib patches from http://www.snapgear.com/)) #20 三 6月 1
- 8 00:58:31 CST 2003
- Processor: Samsung S3C4510B revision 6
- Architecture: SNDS100
- On node 0 totalpages: 4096
- zone(0): 0 pages.
- zone(1): 4096
- pages. zone(2): 0 pages.
- Kernel command line: root=/dev/rom0
- Calibrating delay loop... 49.76 BogoMIPS
- Memory: 16MB = 16MB total
- Memory: 14348KB available (1615K code, 156K data, 40K init)
- Dentry cache hash table entries: 2048 (order: 2, 16384 bytes)
- Inode cache hash table entries: 1024 (order: 1,
- Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
- Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
- Page-cache hash table entries: 4096 (order: 2, 16384 bytes)
- POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4
- Based upon Swansea University Computer Society NET3.039
- Initializing RT netlink socket
- Starting kswapd
- Samsung S3C4510 Serial driver version 0.9 (2001-12-27) with no serial options en abled
- ttyS00 at 0x3ffd000 (irq = 5) is a S3C4510B
- ttyS01 at 0x3ffe000 (irq = 7) is a S3C451
- Blkmem copyright 1998,1999 D. Jeff Dionne
- Blkmem copyright 1998 Kenneth Albanowski
- Blkmem 1 disk images:
- 0: BE558-1A5D57 [VIRTUAL BE558-1A5D57] (RO)
- RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize
- Samsung S3C4510 Ethernet driver version 0.1 (2002-02-20) <[email protected]>
- eth0: 00:40:95:36:35:34
- NET4: Linux TCP/IP 1.0 for NET4.0
- IP Protocols: ICMP, UDP, TCP
- IP: routing cache hash table of 512 buckets, 4Kbytes
- TCP: Hash tables configured (established 1024 bind 1024)
- VFS: Mounted root (romfs Freeing init memory: 40K
複製代碼
上面的這些輸出信息,也可能包括你自己正在做的嵌入式linux開發板的輸出信息,其中的每一行,每一個字的含義,你是否深究過,或者說大部分的含義你能確切地知道的?本人想在這裏結合本人在實踐中一些體會來和廣大嵌入式linux的開發者一起讀懂這些信息。
我們在這裏將以一個真實的嵌入式linux系統的啓動過程爲例,來分析這些輸出信息。啓動信息的原始內容將用標記標出,以區別與註釋。
嵌入式linux的啓動主要分爲兩個階段:
① 第一部分bootloader啓動階段
② 第二部分linux 內核初始化和啓動階段
第一部分 : bootloader啓動
- Boot loader v0.12
- NOTE: this boot loader is designed to boot kernels made with the
- 2.4.xx releases
- bootloader for XV
- Built at Nov 20 2005 10:12:35
複製代碼
Bootloader頭信息,版本,編譯時間等,這個因不同的bootloader的設計而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。
將bootloader加載到內存ram中的0x90060000處,即將bootloader加載到內存的高端地址處。
Linux內核將被bootloader加載到0x90090000處。
查找到了啓動boot的配置信息
- Booted from parallel flash
複製代碼
從flash中啓動代碼,此處的flash爲並行閃存。Flash的分類列舉如下:
閃存分三類:並行,串行,不可擦除。
①並行Parallel flash
NOR Flash,Intel於1988年發明.隨機讀取的速度比較快,隨機按字節寫,每次可以傳輸8Bit。一般適合應用於數據/程序的存貯應用中.NOR還可以片內執行(execute-in-place)XIP.寫入和擦除速度很低。
NAND Flash,1989年,東芝公司發明.是以塊和頁爲單位來讀寫的,不能隨機訪問某個指定的點.因而相對來說讀取速度較慢,而擦除和寫入的速度則比較快,每次可以傳輸16Bit,一般適用在大容量的多媒體應用中,容量大。如:CF,SM.
②串行Serial Flash 是以字節進行傳輸的,每次可以傳輸1-2Bit.如:MMC,SD,MS卡.串行閃存器件體積小,引腳也少,成本相對也更低廉。
③不可擦除Mask Rom Flash的特點是一次性錄入數據,具有不可更改性,經常運用於遊戲和需版權保護文件等的錄入。其顯著特點是成本低。
注意:任何flash器件的寫入操作只能在空或已擦除的單元內進行,所以大多數情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫爲0。
從上面的信息,我們可以對flash類型特點有個比較明確的瞭解。
開發板上所使用的CPU的主頻爲200MHZ.
- DRAM size is 128MB (128MB/0MB)
複製代碼
動態內存ram大小爲128M。這裏我們列舉一下內存的類型及工作原理。
根據內存的工作原理可以劃分出兩種內存:DRAM和SRAM
①DRAM表示動態隨機存取存儲器。這是一種以電荷形式進行存儲的半導體存儲器。DRAM中的每個存儲單元由一個晶體管和一個電容器組成。數據存儲在電容器中。電容器會由於漏電而導致電荷丟失,因而DRAM器件是不穩定的。爲了將數據保存在存儲器中,DRAM器件必須有規律地進行刷新。
②SRAM是靜態的,因此只要供電它就會保持一個值。一般而言,SRAM 比DRAM要快,這是因爲SRAM沒有刷新週期。每個SRAM存儲單元由6個晶體管組成,而DRAM存儲單元由一個晶體管和一個電容器組成。相比而言,DRAM比SRAM每個存儲單元的成本要高。照此推理,可以斷定在給定的固定區域內DRAM的密度比SRAM 的密度要大。
SRAM常常用於高速緩衝存儲器,因爲它有更高的速率;而DRAM常常用於PC中的主存儲器,因爲其擁有更高的密度。 在嵌入式系統中使用DRAM內存的設計比較廣泛。
地址輔助說明:
先說明一下內存地址數字情況,主要是爲了方便記憶。 可以訪問的內存爲4G。 0x40000000是1GB處; 0x00040000是256K處,0x00020000是128K處,0x90000000是2GB多的地方。
- 1M->0x00100000,
- 2M->0x00200000,
- 8M->0x00800000
- 16M->0x01000000,
- 32M->0x02000000
- 256M->0x10000000
- 64K->0x00010000
- 4K->0x00001000
複製代碼
這個是個快速記憶的方法,你可以根據地址中1的位置和其後0的個數來快速知道換算後的地址是在多少兆的地方。比如,1的後面5個0,代表1M的大小,6個0,代表16M,以此類推。
- ROMFS found at 0x46040000, Volume name = rom 43f291aa
複製代碼
romfs,只讀文件系統所在的地址爲:0x46040000 (flash映射後的第3分區)。
卷名爲rom。
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 kernel內核文件名,它是在只讀文件系統romfs上的一個組成部分。
- Unzipping image from 0x4639DE60 to 0x90090000, size = 1316021
複製代碼
將romfs中的linux kernel解壓縮到0x90090000,之後會從這個內存地址啓動內核。romfs爲壓縮格式文件,使用壓縮的只讀文件系統,是爲了保持製作出來的整個系統所佔用的flash空間減小。這個內核的大小爲1.3M左右,這也是目前大多數嵌入系統所使用的方法。
- Inptr = 0x00000014(20)Inflating....
複製代碼
釋放,解壓中。。。(變大,充氣, 膨脹)
- Outcnt = 0x0030e7c8(3205064)Final Inptr = 0x001414ad(1316013)Original CRC = 0xcbd73adbComputed CRC = 0xcbd73adb
複製代碼
做釋放後的CRC檢查
- Boot kernel at 0x90090000 with ROMFS at 0x46040000
複製代碼
kernel已經被從romfs中釋放到內存地址0x90090000處,可以跳轉到此處啓動kernel了,這裏是指定的kernel的起始地址
系統等待啓動,後面將看到linux kernel的啓動過程。 |