Blackrose's Blog Blackrose's Blog

U-Boot的load命令

in technologyread (63) 文章转载请注明来源!

问题:AM335x上面运行uboot后并没有启动第一个FAT分区的zImage和dtb文件,而是第二个Ext4分区下/boot目录下的文件。

跟踪bootcmd后,发现在load zImage时,有如下命令

loadimage=load mmc ${bootpart} ${loadaddr} ${bootdir}/${bootfile}

这里使用了load命令从mmc的第二个分区的$bootdir目录加载$bootfile到内存中,这也就解释了前面的问题。看起来这个load命令是可以识别出filesystem的类型,跟到代码中发现果然是这样。

load命令是由cmd/fs.c文件来提供,调用了fs/fs.c中的do_load()函数,这里的fstype是FS_TYPE_ANY,显然后面应该有判断FS种类的过程。

// load_cmd/fs.c
do_load_wrapper()
{
    do_load(cmdtp, flag, argc, argv, FS_TYPE_ANY);
}

// fs/fs.c
do_load() 
{
    if(fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, fstype))
        return 1;
}

int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
{

        for (i = 0, info = fstypes; i < ARRAY_SIZE(fstypes); i++, info++) {
                 if (fstype != FS_TYPE_ANY && info->fstype != FS_TYPE_ANY &&
                                 fstype != info->fstype)
                         continue;

                 if (!fs_dev_desc && !info->null_dev_desc_ok)
                         continue;

                 if (!info->probe(fs_dev_desc, &fs_partition)) {
                         fs_type = info->fstype;
                         return 0;
                 }
         }

}

fstypes是个数组,里面有支持的FS的描述信息和对应read,write操作的指针。大概浏览了下,FAT,EXT4和UBIFS的检测。FAT是检查分区是否有0x55aa的标识。EXT4和UBIFS是用对应mount()尝试是否可以挂载成功,来判断FS的类型。判断结束后,就可以用fstypes中的read来加载目标文件到内存中。

文章二维码

扫描二维码,在手机上阅读!

发表新评论
博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
前篇 后篇
雷姆
拉姆