作為一名嵌入系統開發者,你一定遇到過下面的情景:
在某論壇上看到一篇帖子,上面貼著嵌入式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) <mac@os.nctu.edu.tw>
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頭信息,版本,編譯時間等,這個因不同的bootloader的設計而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。
Loaded to 0x90060000
將bootloader載入到內存ram中的0x90060000處,即將bootloader載入到內存的高端地址處。Linux內核將被bootloader載入到0x90090000處:
Found boot configuration
查找到了啟動boot的配置信息:
Booted from parallel flash
從flash中啟動代碼,此處的flash為并行快閃記憶體。Flash的分類列舉如下:
快閃記憶體分三類:并行,串列,不可擦除。
注意:任何flash器件的寫入操作只能在空或已擦除的單元內進行,所以大多數情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為0。
從上面的信息,我們可以對flash類型特點有個比較明確的了解。
CPU clock rate: 200 MHz
開發板上所使用的CPU的主頻為200MHZ:
DRAM size is 128MB (128MB/0MB)
動態內存ram大小為128M。這裡我們列舉一下內存的類型及工作原理。
根據內存的工作原理可以劃分出兩種內存: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中的“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:”就是虛擬文件系統管理器操作時的輸出信息了。
File linux.bin.gz found
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 = 0xcbd73adb
Computed CRC = 0xcbd73adb
做釋放后的CRC檢查:
Boot kernel at 0x90090000 with ROMFS at 0x46040000
kernel已經被從romfs中釋放到內存地址0x90090000處,可以跳轉到此處啟動kernel了,這裡是指定的kernel的起始地址
Press 'enter' to boot
系統等待啟動,後面將看到linux kernel的啟動過程了。
[admin via 研發互助社區 ] 嵌入式linux系統的啟動信息註釋已經有5087次圍觀
http://cocdig.com/docs/show-post-42274.html