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