Uboot引導kernel問題小結 linux
圖1:app
問題一,wrong image format for bootm command問題post
原來要用uboot的tools文件中的mkimage命令把zImage格式改爲uImage格式。那麼uboot就能夠認識了。uImage比zImage多0x40個byte的頭。spa
問題二,done, booting the kernel問題追蹤指針
1,因爲沒法保存env。因此去查問題,發現原來nand write都沒法寫入。orm
因而修改了s3c2410_nand.c文件,即解決了問題。blog
2,懷疑typeID不對。後來進過打印信息,看uboot的id,沒問題。而後看tq uboot的ID也是168,tq的uboot能引導。那麼說明ID是正確的。內存
3,因而沒方向了。把參數設置爲和tq的env參數一致,等等不一樣參數的設置,都嘗試過了。不行。ci
4,開始查uboot是如何引導kernel的源碼流程。知道了在bootm.c文件中。可是uboot是如何調用kernel的呢?PC指針式如何指向的呢?後來才知道r0,r1,r2傳遞過去的。另外查了下kernel的地址是bootm告訴uboot的。postmessage
5,接着無心間發現別人看30000100內存。我也想辦法看內存信息,這樣就知道要傳遞的參數是否正確了。
6,因而發現kernel參數真的不正確。如圖1:
7,因而開始關注這些TAG及地址0x5442000x等。在apple2440.h中添加了宏開關後終於解決了問題。不過暫時發現CONFIG_INITRD_TAG定義了沒有用。而我以前CONFIG_SETUP_MEMORY_TAGS宏是開了,可是CONFIG_CMDLINE_TAG沒開,打開後,就能引導kernel了。
uboot問題:關於uboot引導uImage的問題 ———————————————————— 一、-a參數後是內核的運行地址,-e參數後是入口地址。 二、 1)若是咱們沒用mkimage對內核進行處理的話,那直接把內核下載到0x30008000再運行就行,內核會自解壓運行(不過內核運行須要一個tag來傳遞參數,而這個tag建議是由bootloader提供的,在u-boot下默認是由bootm命令創建的)。 2)若是使用mkimage生成內核鏡像文件的話,會在內核的前頭加上了64byte的信息,供創建tag之用。bootm命令會首先判斷bootm xxxx 這個指定的地址xxxx是否與-a指定的加載地址相同。 (1)若是不一樣的話會從這個地址開始提取出這個64byte的頭部,對其進行分析,而後把去掉頭部的內核複製到-a指定的load地址中去運行之 (2)若是相同的話那就讓其原封不一樣的放在那,但-e指定的入口地址會推後64byte,以跳過這64byte的頭部。 ———————————————————————————————— 地址不相同時: [root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img Image Name: linux-2.6.14 Created: Fri Jan 12 17:14:50 2007 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB Load Address: 0x30008000 Entry Point: 0x30008000 地址不相同時: [root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.imgImage Name: linux-2.6.14Created: Fri Jan 12 17:14:50 2007Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MBLoad Address: 0x30008000Entry Point: 0x30008040——————————————————————————————————終於明白了freescale手冊中用mkimage製做uImage的命令:mkimage -A arm -O linux -T kernel -C none -a 0x90008000 -e 0x90008000 -n "Linux-<2.6.31>-xie-20110714-1" -d zImage-7-14 uImage-7-14該命令屬於實際loadaddr(0x90800000)與-a(0x90008000)選項後的地址不一樣,故uboot會分析64字節頭部,而後將內核複製到0x90008000,並從入口地址運行內核。————————————————————若是要把內核載入到0x90008000這個地址,且使之能運行,mkimage的命令以下:mkimage -A arm -O linux -T kernel -C none -a 0x90008000 -e 0x90008040 -n "Linux-<2.6.38>-xie-20110720-3-2" -d zImage-38-3 uImage-38-3 |