嵌入式linux啓動信息註釋之bootloader

 

 嵌入式linux啓動信息註釋之bootloader

  作爲一名嵌入系統開發者,你一定遇到過下面的情景:

  在某論壇上看到一篇帖子,上面貼着嵌入式linux開發板啓動時的有關信息,然後大家在帖子裏討論着這個啓動過程中出現的問題,隨機舉例如下:
  1. Linux version 2.4.20-uc0 (root@Local) (gcc version 2.95.3 20010315 (release) (ColdFire patches - 20010318 from http://f 
  2. (uClinux XIP and shared lib patches from http://www.snapgear.com/)) #20 三 6月 1 
  3. 8 00:58:31 CST 2003
  4. Processor: Samsung S3C4510B revision 6
  5. Architecture: SNDS100 
  6. On node 0 totalpages: 4096 
  7. zone(0): 0 pages. 
  8. zone(1): 4096 
  9. pages. zone(2): 0 pages. 
  10. Kernel command line: root=/dev/rom0 
  11. Calibrating delay loop... 49.76 BogoMIPS 
  12. Memory: 16MB = 16MB total 
  13. Memory: 14348KB available (1615K code, 156K data, 40K init) 
  14. Dentry cache hash table entries: 2048 (order: 2, 16384 bytes) 
  15. Inode cache hash table entries: 1024 (order: 1, 
  16. Mount-cache hash table entries: 512 (order: 0, 4096 bytes) 
  17. Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes) 
  18. Page-cache hash table entries: 4096 (order: 2, 16384 bytes) 
  19. POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4 
  20. Based upon Swansea University Computer Society NET3.039
  21. Initializing RT netlink socket 
  22. Starting kswapd
  23. Samsung S3C4510 Serial driver version 0.9 (2001-12-27) with no serial options en abled
  24. ttyS00 at 0x3ffd000 (irq = 5) is a S3C4510B 
  25. ttyS01 at 0x3ffe000 (irq = 7) is a S3C451 
  26. Blkmem copyright 1998,1999 D. Jeff Dionne
  27. Blkmem copyright 1998 Kenneth Albanowski 
  28. Blkmem 1 disk images:
  29. 0: BE558-1A5D57 [VIRTUAL BE558-1A5D57] (RO) 
  30. RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize 
  31. Samsung S3C4510 Ethernet driver version 0.1 (2002-02-20) <[email protected]>
  32. eth0: 00:40:95:36:35:34 
  33. NET4: Linux TCP/IP 1.0 for NET4.0 
  34. IP Protocols: ICMP, UDP, TCP 
  35. IP: routing cache hash table of 512 buckets, 4Kbytes 
  36. TCP: Hash tables configured (established 1024 bind 1024) 
  37. VFS: Mounted root (romfs Freeing init memory: 40K
複製代碼
上面的這些輸出信息,也可能包括你自己正在做的嵌入式linux開發板的輸出信息,其中的每一行,每一個字的含義,你是否深究過,或者說大部分的含義你能確切地知道的?本人想在這裏結合本人在實踐中一些體會來和廣大嵌入式linux的開發者一起讀懂這些信息。

  我們在這裏將以一個真實的嵌入式linux系統的啓動過程爲例,來分析這些輸出信息。啓動信息的原始內容將用標記標出,以區別與註釋。 

  嵌入式linux的啓動主要分爲兩個階段:

  ① 第一部分bootloader啓動階段

  ② 第二部分linux 內核初始化和啓動階段

  第一部分 : bootloader啓動
  1. Boot loader v0.12
  2. NOTE: this boot loader is designed to boot kernels made with the
  3. 2.4.xx releases
  4. bootloader for XV
  5. Built at Nov 20 2005 10:12:35
複製代碼
Bootloader頭信息,版本,編譯時間等,這個因不同的bootloader的設計而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。
  1. Loaded to 0x90060000
複製代碼
將bootloader加載到內存ram中的0x90060000處,即將bootloader加載到內存的高端地址處。

  Linux內核將被bootloader加載到0x90090000處。
  1. Found boot configuration
複製代碼
查找到了啓動boot的配置信息
  1. 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類型特點有個比較明確的瞭解。
  1. CPU clock rate: 200 MHz
複製代碼
開發板上所使用的CPU的主頻爲200MHZ.
  1. 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多的地方。
  1. 1M->0x00100000, 
  2. 2M->0x00200000,
  3. 8M->0x00800000
  4. 16M->0x01000000, 
  5. 32M->0x02000000
  6. 256M->0x10000000
  7. 64K->0x00010000
  8. 4K->0x00001000
複製代碼
這個是個快速記憶的方法,你可以根據地址中1的位置和其後0的個數來快速知道換算後的地址是在多少兆的地方。比如,1的後面5個0,代表1M的大小,6個0,代表16M,以此類推。
  1. 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:"就是虛擬文件系統管理器操作時的輸出信息了。
  1. File linux.bin.gz found
複製代碼
linux kernel內核文件名,它是在只讀文件系統romfs上的一個組成部分。
  1. Unzipping image from 0x4639DE60 to 0x90090000, size = 1316021
複製代碼
將romfs中的linux kernel解壓縮到0x90090000,之後會從這個內存地址啓動內核。romfs爲壓縮格式文件,使用壓縮的只讀文件系統,是爲了保持製作出來的整個系統所佔用的flash空間減小。這個內核的大小爲1.3M左右,這也是目前大多數嵌入系統所使用的方法。
  1. Inptr = 0x00000014(20)Inflating....
複製代碼
釋放,解壓中。。。(變大,充氣, 膨脹)
  1. Outcnt = 0x0030e7c8(3205064)Final Inptr = 0x001414ad(1316013)Original CRC = 0xcbd73adbComputed CRC = 0xcbd73adb
複製代碼
做釋放後的CRC檢查
  1. Boot kernel at 0x90090000 with ROMFS at 0x46040000
複製代碼
kernel已經被從romfs中釋放到內存地址0x90090000處,可以跳轉到此處啓動kernel了,這裏是指定的kernel的起始地址
  1. Press 'enter' to boot
複製代碼
系統等待啓動,後面將看到linux kernel的啓動過程。
發佈了14 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章