U-Boot启动引导内核分析(二).doc_第1页
U-Boot启动引导内核分析(二).doc_第2页
U-Boot启动引导内核分析(二).doc_第3页
U-Boot启动引导内核分析(二).doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

U-Boot启动引导内核分析(二) 2011-03-23 09:20:00| 分类: 默认分类 | 标签: |字号大中小 订阅也许细心的你会问:我在用UBoot的时候并没有直接进入用户命令界面呀,而是在倒计时结束后自动引导kernel。这是怎么回事呢?在 main_loop()函数当中有如下一段代码:#if defined(CONFIG_BOOTDELAY) & (CONFIG_BOOTDELAY = 0) ? ? ?s = getenv (bootcmd); /*获取bootcmd 的内容*/ /*bootcmd=nand read 0x22000000 0xB0000 0x200000; bootm */ ? ?# ifndef CFG_HUSH_PARSER run_command (s, 0); /*运行s包含的命令*/ /*运行nand read 0x22000000 0xB0000 0x200000表示将NANDFLASH 0xB0000处数据读取放于0x22000000处,读取长度为0x200000 */ /*运行bootm命令,引导内核启动*/# else parse_string_outer(s, FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);# endif ? ? ?#endif /* CONFIG_BOOTDELAY */bootm命令是什么?它是怎样引导内核的?要知道想解决这个问题,就要分析common/cmd_bootm.c中的函数do_bootm,因为引导kernel就是bootm这条命令的工作,do_bootm是命令bootm的执行函数。现在我们来分析一下common/cmd_bootm.c中的函数do_bootm,这是bootm命令的处理函数。int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv) ulong iflag; const char *type_name; uint unc_len = CFG_BOOTM_LEN; uint8_t comp, type, os; void *os_hdr; ulong os_data, os_len; ulong image_start, image_end; ulong load_start, load_end; ulong mem_start; phys_size_t mem_size; struct lmb lmb; memset (void *)&images, 0, sizeof (images); images.verify = getenv_yesno (verify); images.lmb = &lmb; lmb_init(&lmb); mem_start = getenv_bootm_low(); mem_size = getenv_bootm_size(); lmb_add(&lmb, (phys_addr_t)mem_start, mem_size); board_lmb_reserve(&lmb); /* get kernel image header, start address and length */ /* 获取内核镜像头信息 */ /* 打印 “# Booting kernel from Legacy Image at 22000000 . Image Name: Linux-2.6.30 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1507760 Bytes = 1.4 MB Load Address: 20008000 Entry Point: 20008000 Verifying Checksum . OK”*/ os_hdr = boot_get_kernel (cmdtp, flag, argc, argv, &images, &os_data, &os_len); if (os_len = 0) puts (ERROR: cant get kernel image!n); return 1; /* get image parameters */ /* 获取内核镜像格式 */ switch (genimg_get_format (os_hdr) case IMAGE_FORMAT_LEGACY: /* 获取内核镜像参数 */ type = image_get_type (os_hdr); comp = image_get_comp (os_hdr); os = image_get_os (os_hdr); image_end = image_get_image_end (os_hdr); load_start = image_get_load (os_hdr); break; image_start = (ulong)os_hdr; load_end = 0; type_name = genimg_get_type_name (type); /* 禁止所有中断 */ iflag = disable_interrupts();#ifdef CONFIG_AMIGAONEG3SE /* * Weve possible left the caches enabled during * bios emulation, so turn them off again */ icache_disable(); invalidate_l1_instruction_cache(); flush_data_cache(); dcache_disable();#endif switch (comp) case IH_COMP_NONE: /* 加载内核镜像 */ /* 打印“Loading Kernel Image . OK” */ if (load_start = (ulong)os_hdr) printf ( XIP %s . , type_name); else printf ( Loading %s . , type_name); memmove_wd (void *)load_start, (void *)os_data, os_len, CHUNKSZ); load_end = load_start + os_len; puts(OKn); break; puts (OKn); debug ( kernel loaded at 0x%08lx, end = 0x%08lxn, load_start, load_end); show_boot_progress (7); /* 加载错误 */ if (load_start image_start) debug (image_start = 0x%lX, image_end = 0x%lxn, image_start, image_end); debug (load_start = 0x%lx, load_end = 0x%lxn, load_start, load_end); if (images.legacy_hdr_valid) if (image_get_type (&images.legacy_hdr_os_copy) = IH_TYPE_MULTI) puts (WARNING: legacy format multi component image overwrittenn); else puts (ERROR: new format image overwritten - must RESET the board to recovern); show_boot_progress (-113); do_reset (cmdtp, flag, argc, argv); show_boot_progress (8); lmb_reserve(&lmb, load_start, (load_end - load_start); switch (os) default: /* handled by (original) Linux case */ case IH_OS_LINUX:#ifdef CONFIG_SILENT_CONSOLE fixup_silent_linux();#endif /* 引导内核启动函数 */ do_bootm_linux (cmdtp, flag, argc, argv, &images); break; show_boot_progress (-9);#ifdef DEBUG p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论