uclinux啟動過程詳細分析
CPU clock rate: 200 MHz
本文引用地址:http://2s4d.com/article/201808/388126.htm開發(fā)板上所使用的CPU的主頻為200MHZ。
DRAM size is 128MB (128MB/0MB)
動態(tài)內(nèi)存ram大小為128M。
在嵌入式系統(tǒng)中使用DRAM內(nèi)存的設計比較廣泛。
在uclinux的系統(tǒng)中,系統(tǒng)運行時間較長后,會出現(xiàn)內(nèi)存碎片的問題,導致再分配大塊內(nèi)存時會失敗。這是在uclinux系統(tǒng)中經(jīng)常遇到的問題,解決的辦法通常有使用靜態(tài)內(nèi)存、應用程序啟動時預先分配大內(nèi)存、使用內(nèi)存池等。
地址輔助說明:
先說明一下內(nèi)存地址數(shù)字情況,主要是為了方便記憶。
可以訪問的內(nèi)存為4G。0x40000000是1GB處;0x00040000是256K處,0x00020000是128K處,0x90000000是2GB多的地方。1M-》0x00100000, 2M-》0x00200000,8M-》0x00800000,16M-》0x01000000, 32M-》0x02000000,256M-》0x10000000,64K-》0x00010000,注意:rootfs并不是一個具體的文件系統(tǒng)類型,如jffs。它只是一個理論上的概念。在具體的嵌入系統(tǒng)實例中,可以將某種具體的文件系統(tǒng)設置為根文件系統(tǒng)rootfs,如我們可以設置romfs為根文件系統(tǒng),也可以設置jffs為根文件系統(tǒng)。
這里的ROMFS只讀文件系統(tǒng)只是一種具體的文件系統(tǒng)類型,也是在嵌入系統(tǒng)中經(jīng)常使用到的類型。
看完了上面的內(nèi)容,以后你對出現(xiàn)的類似“kernel Panic:VFS:Unable to mount root fs on 0:00”的含義應該已經(jīng)了解了。其中“VFS:”就是虛擬文件系統(tǒng)管理器操作時的輸出信息了。
File linux.bin.gz found
linux kernel內(nèi)核文件名,它是在只讀文件系統(tǒng)romfs上的一個組成部分。
Unzipping image from 0x4639DE60 to 0x90090000, size = 1316021
將romfs中的linux kernel解壓縮到0x90090000,之后會從這個內(nèi)存地址啟動內(nèi)核。romfs為壓縮格式文件,使用壓縮的只讀文件系統(tǒng),是為了保持制作出來的整 個系統(tǒng)所占用的flash空間減小。這個內(nèi)核的大小為1.3M左右,這也是目前大多數(shù)嵌入系統(tǒng)所使用的方法。
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已經(jīng)被從romfs中釋放到內(nèi)存地址0x90090000處,可以跳轉(zhuǎn)到此處啟動kernel了,這里是指定的kernel的起始地址。
Press ‘enter’ to boot
系統(tǒng)等待啟動,后面將看到linux kernel的啟動過程了。
4K-》0x00001000這個是個快速記憶的方法,你可以根據(jù)地址中1的位置和其后0的個數(shù)來快速知道換算后的地址是在多少兆的地方。比如,1的后面5個0,代表1M的大小,6個0,代表16M,以此類推。
ROMFS found at 0x46040000, Volume name = rom 43f291aa
romfs,只讀文件系統(tǒng)所在的地址為:0x46040000 (flash映射后的第3分區(qū))。卷名為rom。
romfs 和rootfs概念上有所區(qū)別。flash在內(nèi)存中的的起始地址為0x46000000,而ROMFS在flash分區(qū)上的起始位置為0x00040000,所以ROMFS在內(nèi)存地址中的位置就為0x46040000。這個細節(jié)的部分可以參考flash分區(qū)時的地方,Creating 3 MTD partitions。
romfs中包括kernel和app應用,不包括bootloader和firmware信息頭。romfs只讀文件系統(tǒng)里的內(nèi)容有很多種分類方法,我們可以將kernel和app同時放里面,作為根文件系統(tǒng)下的一個文件,也可以在flash上另外劃分區(qū)域來分別存放。
*****************************************************************************
第一節(jié):start_kernel
Linux的源代碼可以從 www.kernel.org 得到,或者你可以查看linux代碼交叉引用網(wǎng)站:http://lxr.linux.no/ 進行在線的代碼查看,這是一個很好的工具網(wǎng)站。
在start_kernel中將調(diào)用到大量的init函數(shù),來完成內(nèi)核的各種初始化。如:
圖 2:kernel start up初始化過程
具體內(nèi)容可以參考[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啟動函數(shù)。
uclinux使用的是linux內(nèi)核版本為2.4.22。linux source code代碼中start_kernel中輸出的linux_banner信息。這個信息是每個linux kernel都會打印一下的信息,如果你沒有把這句去掉的話。
Found bootloader memory map at 0x10000fc0.
bootloader經(jīng)過內(nèi)存映射后的地址為: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.
預留內(nèi)存大小,在節(jié)點0上總共20頁, zone(0) 設置最小內(nèi)存為12MB, zone(1)和zone(2)為0頁。警告:對齊不正確。
Kernel command line: root=/dev/mtdblock3
Kernel 啟動命令設為:/dev/mtdblock3(在后面的說明中會看到mtdblock3是指的flash上的romfs分區(qū)。),用來指定根文件系統(tǒng)所在的位置,kernel會將塊設備mtdblock3當作文件系統(tǒng)來處理。也就是說,內(nèi)核會根據(jù)上面的kernel命令行,知道只讀文件系統(tǒng)romfs將是 根文件系統(tǒng)rootfs。
start_kernel(void) 中輸出的上面的這句信息。這行命令是在linux內(nèi)核啟動過程中都會輸出的一句。
Console: colour dummy device 80x30
代碼中console_init()的輸出信息, 顯示控制臺屬性:一般使用VGA text console,標準是80 X 25行列的文本控制臺,這里是對屬性進行了設置。
評論