uclinux啟動過程詳細分析
CPU clock rate: 200 MHz
本文引用地址:http://www.104case.com/article/201808/388126.htm開發板上所使用的CPU的主頻為200MHZ。
DRAM size is 128MB (128MB/0MB)
動態內存ram大小為128M。
在嵌入式系統中使用DRAM內存的設計比較廣泛。
在uclinux的系統中,系統運行時間較長后,會出現內存碎片的問題,導致再分配大塊內存時會失敗。這是在uclinux系統中經常遇到的問題,解決的辦法通常有使用靜態內存、應用程序啟動時預先分配大內存、使用內存池等。
地址輔助說明:
先說明一下內存地址數字情況,主要是為了方便記憶。
可以訪問的內存為4G。0x40000000是1GB處;0x00040000是256K處,0x00020000是128K處,0x90000000是2GB多的地方。1M-》0x00100000, 2M-》0x00200000,8M-》0x00800000,16M-》0x01000000, 32M-》0x02000000,256M-》0x10000000,64K-》0x00010000,注意: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 = 0xcbd73adbComputed CRC = 0xcbd73adb
做釋放后的CRC檢查。
Boot kernel at 0x90090000 with ROMFS at 0x46040000
kernel已經被從romfs中釋放到內存地址0x90090000處,可以跳轉到此處啟動kernel了,這里是指定的kernel的起始地址。
Press ‘enter’ to boot
系統等待啟動,后面將看到linux kernel的啟動過程了。
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上另外劃分區域來分別存放。
*****************************************************************************
第一節:start_kernel
Linux的源代碼可以從 www.kernel.org 得到,或者你可以查看linux代碼交叉引用網站:http://lxr.linux.no/ 進行在線的代碼查看,這是一個很好的工具網站。
在start_kernel中將調用到大量的init函數,來完成內核的各種初始化。如:
圖 2:kernel start up初始化過程
具體內容可以參考[http://lxr.linux.no/source/init/main.c]
Linux version 2.4.22-uc0 (root@local) (gcc version 2.95.3 20010315 (release)) #33 。?1…… 20 12:09:106
上面的代碼輸出信息,是跟蹤linux代碼分析后得到的,進入init目錄下的main.c的start_kernel啟動函數。
uclinux使用的是linux內核版本為2.4.22。linux source code代碼中start_kernel中輸出的linux_banner信息。這個信息是每個linux kernel都會打印一下的信息,如果你沒有把這句去掉的話。
Found bootloader memory map at 0x10000fc0.
bootloader經過內存映射后的地址為:0x10000fc0, 按上面的地址換算方法,1后面有7個0,那么虛擬地址256M左右處。
Processor: ARM pt110 revision 0
pT110是ARM微處理器arm核的一種,另一種為pT100。此處為顯示ARM的類型。
On node 0 totalpages: 20480
zone(0): 20480 pages.
zone(0): Set minimum memory threshold to 12288KB
Warning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000)
zone(1): 0 pages.
zone(2): 0 pages.
預留內存大小,在節點0上總共20頁, zone(0) 設置最小內存為12MB, zone(1)和zone(2)為0頁。警告:對齊不正確。
Kernel command line: root=/dev/mtdblock3
Kernel 啟動命令設為:/dev/mtdblock3(在后面的說明中會看到mtdblock3是指的flash上的romfs分區。),用來指定根文件系統所在的位置,kernel會將塊設備mtdblock3當作文件系統來處理。也就是說,內核會根據上面的kernel命令行,知道只讀文件系統romfs將是 根文件系統rootfs。
start_kernel(void) 中輸出的上面的這句信息。這行命令是在linux內核啟動過程中都會輸出的一句。
Console: colour dummy device 80x30
代碼中console_init()的輸出信息, 顯示控制臺屬性:一般使用VGA text console,標準是80 X 25行列的文本控制臺,這里是對屬性進行了設置。
評論