嵌入式linux系統的啟動信息註釋

admin @ 2014-03-25 , reply:0

     作為一名嵌入系統開發者,你一定遇到過下面的情景:
    在某論壇上看到一篇帖子,上面貼著嵌入式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的啟動主要分為兩個階段:

  1. 第一部分bootloader啟動階段
  2. 第二部分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的分類列舉如下:
  快閃記憶體分三類:并行,串列,不可擦除。

  1. 并行Parallel flash
      NOR Flash,Intel於1988年發明.隨機讀取的速度比較快,隨機按位元組寫,每次可以傳輸8Bit。一般適合應用於數據/程序的存貯應用中.NOR還可以片內執行(execute-in-place)XIP.寫入和擦除速度很低。
      NAND Flash,1989年,東芝公司發明.是以塊和頁為單位來讀寫的,不能隨機訪問某個指定的點.因而相對來說讀取速度較慢,而擦除和寫入的速度則比較快,每次可以傳輸16Bit,一般適用在大容量的多媒體應用中,容量大。如:CF,SM.
  2. 串列Serial Flash 是以位元組進行傳輸的,每次可以傳輸1-2Bit.如:MMC,SD,MS卡.串列快閃記憶體器件體積小,引腳也少,成本相對也更低廉。 
  3. 不可擦除Mask Rom Flash的特點是一次性錄入數據,具有不可更改性,經常運用於遊戲和需版權保護文件等的錄入。其顯著特點是成本低。

  注意:任何flash器件的寫入操作只能在空或已擦除的單元內進行,所以大多數情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為0。
  從上面的信息,我們可以對flash類型特點有個比較明確的了解。

CPU clock rate: 200 MHz
  開發板上所使用的CPU的主頻為200MHZ:

DRAM size is 128MB (128MB/0MB)
  動態內存ram大小為128M。這裡我們列舉一下內存的類型及工作原理。

根據內存的工作原理可以劃分出兩種內存:DRAM和SRAM

  1. DRAM表示動態隨機存取存儲器。這是一種以電荷形式進行存儲的半導體存儲器。DRAM中的每個存儲單元由一個晶體管和一個電容器組成。數據存儲在電容器中。電容器會由於漏電而導致電荷丟失,因而DRAM器件是不穩定的。為了將數據保存在存儲器中,DRAM器件必須有規律地進行刷新。
  2. 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 下的文件系統主要可分為三大塊:

  1. 一是上層的文件系統的系統調用,
  2. 二是虛擬文件系統交換器 VFS(Virtual Filesystem Switch),
  3. 三是掛載到 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:”就是虛擬文件系統管理器操作時的輸出信息了。

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系統的啟動信息註釋已經有1391次圍觀

http://cocdig.com/docs/show-post-42274.html