linux内核挂载ramdisk的代码流程分析

Uboot中对ramdisk的处理流程

do_bootm

int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])

->do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START |

                              BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER |

                              BOOTM_STATE_LOADOS |

                              BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |

                              BOOTM_STATE_OS_GO, &images, 1);}

do_bootm_states

int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],

                                  int states, bootm_headers_t *images, int boot_progress)

bootm_find_other(cmdtp, flag, argc, argv);  //这里获取 ramdisk.imgstartend信息

bootm_os_get_boot_func(images->os.os);

               need_boot_fn = states & (BOOTM_STATE_OS_CMDLINE |

                                             BOOTM_STATE_OS_BD_T | BOOTM_STATE_OS_PREP |

                                             BOOTM_STATE_OS_FAKE_GO | BOOTM_STATE_OS_GO);

               if (boot_fn == NULL && need_boot_fn) {

                              if (iflag)

                                             enable_interrupts();

                              printf("ERROR: booting os '%s' (%d) is not supported\n",

                                     genimg_get_os_name(images->os.os), images->os.os);

                              bootstage_error(BOOTSTAGE_ID_CHECK_BOOT_OS);

                              return 1;

               }

bootm_find_other

static int bootm_find_other(cmd_tbl_t *cmdtp, int flag, int argc,

                                                 char * const argv[])

{

               if (((images.os.type == IH_TYPE_KERNEL) ||

                    (images.os.type == IH_TYPE_KERNEL_NOLOAD) ||

                    (images.os.type == IH_TYPE_MULTI)) &&

                   (images.os.os == IH_OS_LINUX ||

                               images.os.os == IH_OS_VXWORKS))

                              return bootm_find_images(flag, argc, argv);

               return 0;

}

bootm_find_images

int bootm_find_images(int flag, int argc, char * const argv[])

{

               int ret;

               /* find ramdisk */

               ret = boot_get_ramdisk(argc, argv, &images, IH_INITRD_ARCH,

                                                    &images.rd_start, &images.rd_end);

               if (ret) {

                              puts("Ramdisk image is corrupt or invalid\n");

                              return 1;

               }

​​​​​​​boot_get_ramdisk

int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,

                              uint8_t arch, ulong *rd_start, ulong *rd_end)

{

               ulong rd_addr, rd_load;

               ulong rd_data, rd_len;

#if defined(CONFIG_IMAGE_FORMAT_LEGACY)

               const image_header_t *rd_hdr;

#endif

               void *buf;

#ifdef CONFIG_SUPPORT_RAW_INITRD

               char *end;

#endif

#if IMAGE_ENABLE_FIT

               const char           *fit_uname_config = images->fit_uname_cfg;

               const char           *fit_uname_ramdisk = NULL;

               ulong                    default_addr;

               int                         rd_noffset;

#endif

               const char *select = NULL;

               *rd_start = 0;

               *rd_end = 0;

#ifdef CONFIG_ANDROID_BOOT_IMAGE

               /*

                * Look for an Android boot image.

                */

               buf = map_sysmem(images->os.start, 0);

               if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)

                              select = argv[0];

#endif

               if (argc >= 2)

                              select = argv[1];

               /*

                * Look for a '-' which indicates to ignore the

                * ramdisk argument

                */

               if (select && strcmp(select, "-") ==  0) {

                              debug("## Skipping init Ramdisk\n");

                              rd_len = rd_data = 0;

               } else if (select || genimg_has_config(images)) {

#if IMAGE_ENABLE_FIT

                              if (select) {

                                             /*

                                              * If the init ramdisk comes from the FIT image and

                                              * the FIT image address is omitted in the command

                                              * line argument, try to use os FIT image address or

                                              * default load address.

                                              */

                                             if (images->fit_uname_os)

                                                            default_addr = (ulong)images->fit_hdr_os;

                                             else

                                                            default_addr = load_addr;

                                             if (fit_parse_conf(select, default_addr,

                                                                              &rd_addr, &fit_uname_config)) {

                                                            debug("*  ramdisk: config '%s' from image at "

                                                                                          "0x%08lx\n",

                                                                                          fit_uname_config, rd_addr);

                                             } else if (fit_parse_subimage(select, default_addr,

                                                                                          &rd_addr, &fit_uname_ramdisk)) {

                                                            debug("*  ramdisk: subimage '%s' from image at "

                                                                                          "0x%08lx\n",

                                                                                          fit_uname_ramdisk, rd_addr);

                                             } else

#endif

                                             {

                                                            rd_addr = simple_strtoul(select, NULL, 16);

                                                            debug("*  ramdisk: cmdline image address = "

                                                                                          "0x%08lx\n",

                                                                                          rd_addr);

                                             }

#if IMAGE_ENABLE_FIT

                              } else {

                                             /* use FIT configuration provided in first bootm

                                              * command argument. If the property is not defined,

                                              * quit silently.

                                              */

                                             rd_addr = map_to_sysmem(images->fit_hdr_os);

                                             rd_noffset = fit_get_node_from_config(images,

                                                                           FIT_RAMDISK_PROP, rd_addr);

                                             if (rd_noffset == -ENOENT)

                                                            return 0;

                                             else if (rd_noffset < 0)

                                                            return 1;

                              }

#endif

                              /* copy from dataflash if needed */

                              rd_addr = genimg_get_image(rd_addr);

                              /*

                               * Check if there is an initrd image at the

                               * address provided in the second bootm argument

                               * check image type, for FIT images get FIT node.

                               */

                              buf = map_sysmem(rd_addr, 0);

                              switch (genimg_get_format(buf)) {

#if defined(CONFIG_IMAGE_FORMAT_LEGACY)

                              case IMAGE_FORMAT_LEGACY:

                                             printf("## Loading init Ramdisk from Legacy "

                                                                           "Image at %08lx ...\n", rd_addr);

                                             bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK);

                                             rd_hdr = image_get_ramdisk(rd_addr, arch,

                                                                                                         images->verify);

                                             if (rd_hdr == NULL)

                                                            return 1;

                                             rd_data = image_get_data(rd_hdr);

                                             rd_len = image_get_data_size(rd_hdr);

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值