U boot啟動核心原理

2021-05-23 06:29:42 字數 2469 閱讀 9976

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...