U-boot1.1.6只能只能就能過mkimage工具加工後的內核鏡像文件。mkimage工具給zImage增加了一個64B大小的頭。U-Boot是通過bootm命令來引導Linux內核的,bootm命令調用do_bootm函數來mkimage工具增加的頭,最後調用do_bootm_linux函數引導去掉了mkimage工具增加的頭的Linux內核,也就是zImage,啟動的流程可以參考圖解U-Boot:引導內核分析(http://www.linuxidc.com/Linux/2012-03/55965.htm)這篇博客。
要讓U-Boot直接引導zImage內核,只需在do_bootm函數中去掉對mkimage工具增加的頭的分析,直接調用do_bootm_linux函數引導zImage內核即可。下面是經過修改的do_bootm函數,修改的部分用///////////包圍起來了,省略號後面的就不需要改動了。這個函數common/cmd_bootm.c文件中。
- int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
- {
- ulong iflag;
- ulong addr;
- ulong data, len, checksum;
- ulong *len_ptr;
- uint unc_len = CFG_BOOTM_LEN;
- int i, verify;
- char *name, *s;
- int (*appl)(int, char *[]);
- image_header_t *hdr = &header;
- s = getenv ("verify");
- verify = (s && (*s == 'n')) ? 0 : 1;
- if (argc < 2) {
- addr = load_addr;
- } else {
- addr = simple_strtoul(argv[1], NULL, 16);
- }
- SHOW_BOOT_PROGRESS (1);
- //////////////////////////////////////////////////////////////////////////////////
- //printf ("## Booting image at %08lx ...\n", addr);
- printf ("## Booting from zImage at %08lx ---by ce123\n", addr);
- #ifdef CONFIG_SILENT_CONSOLE
- fixup_silent_linux();
- #endif
- do_bootm_linux (cmdtp, flag, argc, argv,
- addr, len_ptr, verify);
- //////////////////////////////////////////////////////////////////////////////////
- ......