uboot备份到u盘

uboot备份到u盘,第1张

具体步骤: 1、将老中配毛桃winpe工具u盘插入电脑u *** 接口,按电源键开机。

屏幕上出现启动画面后按快捷键即可进入主菜单,在此选择“【02】运行老毛桃Win8PE工具箱(装机推荐)”并回车,如图所示: 2、进入卖乎指老毛桃pe系统后会自动运行老毛桃PE一键装机工具,在工具窗口最上方点击“备份分区”选项,如图所示: 3、接着点击“浏览”按钮,在除系统盘以外的分区中选择备份文件保存的位置,然后输入文件名和保存类型,如图所示: 4、返回到工具主窗口,选中系统盘,然后点击“确定”按钮,如图所示: 5、紧接着会d出一个备份提示框,点击高级按钮,字样变成简洁的同时,可以设置备份压缩率、分卷大小等参数,也可以默认设置直接确定开始,如图所示: 6、接下来只需等待系统备份完成,然后进入到系统备份文件所在路径验证是否备份成功,如图所示: 7、最后将备份好的GHOST系统备份文顷昌件拷贝到U盘中即可。

U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等。而Linux kernel也会读取和处理这些参数。两者之间通过struct tag来传递参数。U-boot把要传递给kernel的东西保存在struct tag数据结构中,启动kernel时,把这个结构体的物理地址传给kernel;Linux kernel通过这个地址,用parse_tags分析出传递过来的参数。

本文主要以U-boot传递RAM和Linux kernel读取RAM参数为例进行说明。

1、u-boot给kernel传RAM参数

./common/cmd_bootm.c文件中(指Uboot的根目录),bootm命令对应的do_bootm函数,当分析uImage中信戚誉喊息发现OS是Linux时,调用。/lib_arm/bootm.c文件中的do_bootm_linux函数来启动Linux kernel。

在do_bootm_linux函数中:

void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],\

ulong addr, ulong *len_ptr, int verify)

{

……

#if defined (CONFIG_SETUP_MEMORY_TAGS) || \

defined (CONFIG_CMDLINE_TAG) || \

defined (CONFIG_INITRD_TAG) || \

 高野 defined (CONFIG_SERIAL_TAG) || \

defined (CONFIG_REVISION_TAG) || \

defined (CONFIG_LCD) || \

defined (CONFIG_VFD)

setup_start_tag (bd); //初始化tag结构体开始

#ifdef CONFIG_SERIAL_TAG

setup_serial_tag (?ms);

#endif

#ifdef CONFIG_REVISION_TAG

setup_revision_tag (?ms);

#endif

#ifdef CONFIG_SETUP_MEMORY_TAGS

setup_memory_tags (bd); //设置RAM参数

#endif

#ifdef CONFIG_CMDLINE_TAG

虚锋setup_commandline_tag (bd, commandline);

#endif

#ifdef CONFIG_INITRD_TAG

if (initrd_start &&initrd_end)

setup_initrd_tag (bd, initrd_start, initrd_end);

#endif

#if defined (CONFIG_VFD) || defined (CONFIG_LCD)

setup_videolfb_tag ((gd_t *) gd);

#endif

setup_end_tag (bd); //初始化tag结构体结束

#endif

……

……

theKernel (0, machid, bd->bi_boot_params);

//传给Kernel的参数= (struct tag *)型的bd->bi_boot_params

//bd->bi_boot_params在board_init 函数中初始化,如对于at91rm9200,初始化在at91rm9200dk.c的board_init中进 行:bd->bi_boot_params=PHYS_SDRAM + 0x100

//这个地址也是所有taglist的首地址,见下面的setup_start_tag函数

}

对于setup_start_tag和setup_memory_tags函数说明如下。

函数setup_start_tag也在此文件中定义,如下:

static void setup_start_tag (bd_t *bd)

{

params = (struct tag *) bd->bi_boot_params

//初始化(struct tag *)型的全局变量params为bd->bi_boot_params的地址,之后的setup tags相关函数如下面的setup_memory_tags就把其它tag的数据放在此地址的偏移地址上。

params->hdr.tag = ATAG_CORE

params->hdr.size = tag_size (tag_core);

params->u.core.flags = 0

params->u.core.pagesize = 0

params->u.core.rootdev = 0

params = tag_next (params);

}

RAM相关参数在bootm.c中的函数setup_memory_tags中初始化:

static void setup_memory_tags (bd_t *bd)

{

int i

for (i = 0i <CONFIG_NR_DRAM_BANKSi++) {

params->hdr.tag = ATAG_MEM

params->hdr.size = tag_size (tag_mem32);

params->u.mem.start = bd->bi_dram[i].start

params->u.mem.size = bd->bi_dram[i].size

params = tag_next (params);

} //初始化内存相关tag

}

2、Kernel读取U-boot传递的相关参数

对于Linux Kernel,ARM平台启动时,先执行arch/arm/kernel/head.S,此文件会调用arch/arm/kernel/head- common.S和arch/arm/mm/proc-arm920.S中的函数,并最后调用start_kernel:

……

b start_kernel

……

init/main.c中的start_kernel函数中会调用setup_arch函数来处理各种平台相关的动作,包括了u-boot传递过来参数的分析和保存:

start_kernel()

{

……

setup_arch(&command_line);

……

}

其中,setup_arch函数在arch/arm/kernel/setup.c文件中实现,如下:

void __init setup_arch(char **cmdline_p)

{

struct tag *tags = (struct tag *)&init_tags

struct machine_desc *mdesc

char *from = default_command_line

setup_processor();

mdesc = setup_machine(machine_arch_type);

machine_name = mdesc->name

if (mdesc->soft_reboot)

reboot_setup("s");

if (__atags_pointer)

//指向各种tag起始位置的指针,定义如下:

//unsigned int __atags_pointer __initdata

//此指针指向__initdata段,各种tag的信息保存在这个段中。

tags = phys_to_virt(__atags_pointer);

else if (mdesc->boot_params)

tags = phys_to_virt(mdesc->boot_params);

if (tags->hdr.tag != ATAG_CORE)

convert_to_tag_list(tags);

if (tags->hdr.tag != ATAG_CORE)

tags = (struct tag *)&init_tags

if (mdesc->fixup)

mdesc->fixup(mdesc, tags, &from, &meminfo);

if (tags->hdr.tag == ATAG_CORE) {

if (meminfo.nr_banks != 0)

squash_mem_tags(tags);

save_atags(tags);

parse_tags(tags);

//处理各种tags,其中包括了RAM参数的处理。

//这个函数处理如下tags:

__tagtable(ATAG_MEM, parse_tag_mem32);

__tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);

__tagtable(ATAG_RAMDISK, parse_tag_ramdisk);

__tagtable(ATAG_SERIAL, parse_tag_serialnr);

__tagtable(ATAG_REVISION, parse_tag_revision);

__tagtable(ATAG_CMDLINE, parse_tag_cmdline);

}

init_mm.start_code = (unsigned long) &_text

init_mm.end_code = (unsigned long) &_etext

init_mm.end_data = (unsigned long) &_edata

init_mm.brk = (unsigned long) &_end

memcpy(boot_command_line, from, COMMAND_LINE_SIZE);

boot_command_line[COMMAND_LINE_SIZE-1] = '\0'

parse_cmdline(cmdline_p, from); //处理编译内核时指定的cmdline或u-boot传递的cmdline

paging_init(&meminfo, mdesc);

request_standard_resources(&meminfo, mdesc);

#ifdef CONFIG_SMP

smp_init_cpus();

#endif

cpu_init();

init_arch_irq = mdesc->init_irq

system_timer = mdesc->timer

init_machine = mdesc->init_machine

#ifdef CONFIG_VT

#if defined(CONFIG_VGA_CONSOLE)

conswitchp = &vga_con

#elif defined(CONFIG_DUMMY_CONSOLE)

conswitchp = &dummy_con

#endif

#endif

early_trap_init();

}

对于处理RAM的tag,调用了parse_tag_mem32函数:

static int __init parse_tag_mem32(const struct tag *tag)

{

……

arm_add_memory(tag->u.mem.start, tag->u.mem.size);

……

}

__tagtable(ATAG_MEM, parse_tag_mem32);

上述的arm_add_memory函数定义如下:

static void __init arm_add_memory(unsigned long start, unsigned long size)

{

struct membank *bank

size -= start &~PAGE_MASK

bank = &meminfo.bank[meminfo.nr_banks++]

bank->start = PAGE_ALIGN(start);

bank->size = size &PAGE_MASK

bank->node = PHYS_TO_NID(start);

}

如上可见,parse_tag_mem32函数调用arm_add_memory函数把RAM的start和size等参数保存到了meminfo结构的meminfo结构体中。最后,在setup_arch中执行下面语句:

paging_init(&meminfo, mdesc);

对没有MMU的平台上调用arch/arm/mm/nommu.c中的paging_init,否则调用arch/arm/mm/mmu.c中的paging_init函数。这里暂不分析mmu.c中的paging_init函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12325339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存