u-boot啟動核心原理
arm平台u-boot
啟動核心命令如
:bootcmd=bootm 0xc4040014
在./common/cmd_bootm.c
檔案中,
bootm
命令對應的
do_bootm函式,
當分析uimage
中資訊發現os是
linux
時,呼叫
./lib_arm/armlinux.c
檔案中的
do_bootm_linux
函式來啟動
linux kernel
。image_header_t header;
ulong load_addr = cfg_load_addr;/* default load address */
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv)
else
//判斷執行
bootm
時是否指定了程式載入位址,若沒有則使用預設的載入位址,
load_addr
在此函式前面是這樣定義的
: ulong load_addr = cfg_load_addr;
……
memmove (&header, (char *)addr, sizeof(image_header_t));
//將image
的header
(u-boot
新增的64byte
檔案頭)複製到
header
指向的記憶體。
if (ntohl(hdr->ih_magic) != ih_magic) }//
判斷檔案頭中的幻數是否為
ih_magic
,所以如果不是
u-boot
映象格式,會輸出提示資訊
」bad magic number」。
data = (ulong)&header;
len= sizeof(image_header_t);
checksum = ntohl(hdr->ih_hcrc);
hdr->ih_hcrc = 0;
if (crc32 (0, (char *)data, len) != checksum)
//檢查image
檔案頭header
的crc32
校驗和。
data = addr + sizeof(image_header_t);
len= ntohl(hdr->ih_size);
……
if (verify) }//
檢查image
資料部分
data
的校驗和。
len_ptr = (ulong *)data;
#if defined(__ppc__)
if (hdr->ih_arch != ih_cpu_ppc)
#elif defined(__arm__)
if (hdr->ih_arch != ih_cpu_arm)
#elif defined(__i386__)
if (hdr->ih_arch != ih_cpu_i386)
……
#else
# error unknown cpu type
#endif
//檢查image header
中的arch
型別是否正確。
switch (hdr->ih_type)
//判斷image
的型別
……
switch (hdr->ih_comp)
//根據image
所採用的壓縮型別,將
image
解壓到hdr->ih_load
指向的位址,這個
ih_load
就是在做核心映象時
mkimage
中的-a
選項指定的位址,
-a選項指定的是核心解壓後的位址。
……
switch (hdr->ih_os)
//核心已經解壓完了,接下來啟動
linux
核心,把控制權傳遞給了
do_bootm_linux
函式。
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv,
ulong addr, ulong *len_ptr, int verify)
U boot啟動核心原理
by neil chiao neilchiao at gmail.com neilengineer.cublog.cn 歡迎到 新星灣 www.xinxingwan.com 指導 arm平台u boot啟動核心命令如 bootcmd bootm 0xc4040014 在.common cmd boo...
U boot啟動核心原理
by neil chiao neilchiao at gmail.com neilengineer.cublog.cn 歡迎到 新星灣 www.xinxingwan.com 指導 arm平台u boot啟動核心命令如 bootcmd bootm 0xc4040014 在.common cmd boo...
uboot啟動核心
假設bootcmd nand read.jffs2 0x30007fc0 kernel bootm 0x30007fc0 1 nand read.jffs2 0x30007fc0 kernel nand read.jffs2 0x30007fc0 kernel 從nand讀出核心 從 讀?從kern...