ImageVerifierCode 换一换
格式:DOC , 页数:15 ,大小:58.50KB ,
资源ID:3553046      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3553046.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Uboot启动流程.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

Uboot启动流程.doc

1、U-Boot 启动过程(国嵌)开发板上电后,执行 U-Boot 的第一条指令,然后 顺序执行 U-Boot 启动函数。看一下 board/smdk2410/u-boot.lds 这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是 cpu/arm920t/start.o,那么 U-Boot 的入口指令一定位于这个程序中。下面分两阶段介绍启动流程:第一阶段1cpu/arm920t/start.S这个汇编程序是 U-Boot 的入口程序,开 头就是复位向量的代码。_start: b reset /复位向量ldr pc, _undefined_instructionldr pc, _so

2、ftware_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irq /中断向量ldr pc, _fiq /中断向量/* the actual reset code */reset: /复位启动子程序/* 设置 CPU 为 SVC32 模式 */mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#0xd3msr cpsr,r0/* 关 闭看门 狗 */ relocate: /* 把 U-Boot 重新定位到 RAM */adr r0, _start /* r0 是代码

3、的当前位置 */ldr r1, _TEXT_BASE /*_TEXT_BASE 是 RAM 中的地址 */cmp r0, r1 /* 比较 r0 和 r1,判断当前是从Flash 启动,还是 RAM */beq stack_setup /* 如果 r0 等于 r1,跳过重定位代码 */* 准 备重新定位代 码 */ldr r2, _armboot_startldr r3, _bss_startsub r2, r3, r2 /* r2 得到 armboot 的大小 */add r2, r0, r2 /* r2 得到要复制代码的末尾地址 */copy_loop: /* 重新定位代 码 */ldmi

4、a r0!, r3-r10 /*从源地址r0复制 */stmia r1!, r3-r10 /* 复制到目的地址r1 */cmp r0, r2 /* 复制数据块直到源数据末尾地址 r2 */ble copy_loop/* 初始化堆栈等 */stack_setup:ldr r0, _TEXT_BASE /* 上面是 128 KiB 重定位的 u-boot */sub r0, r0, #CFG_MALLOC_LEN /* 向下是内存分配空间 */sub r0, r0, #CFG_GBL_DATA_SIZE /* 然后是 bdinfo 结构体地址空间 */#ifdef CONFIG_USE_IRQsu

5、b r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsub sp, r0, #12 /* 为 abort-stack 预留 3 个字 */clear_bss:ldr r0, _bss_start /* 找到 bss 段起始地址 */ldr r1, _bss_end /* bss 段末尾地址 */mov r2, #0x00000000 /* 清零 */clbss_l:str r2, r0 /* bss 段地址空间清零循环. */add r0, r0, #4cmp r0, r1bne clbss_l/* 跳 转到 start_ar

6、mboot 函数入口,_start_armboot 字保存函数入口指针 */ldr pc, _start_armboot_start_armboot: .word start_armboot /start_armboot函数在 lib_arm/board.c 中实现第二阶段2lib_arm/board.cstart_armboot 是 U-Boot 执行的第一个 C 语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令。3init_sequenceinit_sequence数组保存着基本的初始化函数指针。init_fnc_t *init_sequence = cpu_init, /*

7、基本的处理器相关配置 - cpu/arm920t/cpu.c */board_init, /* 基本的板级相关配置 - board/smdk2410/smdk2410.c */interrupt_init, /* 初始化中断处理 - cpu/arm920t/s3c24x0/interrupt.c */env_init, /* 初始化环境变量 - common/cmd_flash.c */init_baudrate, /* 初始化波特率设置 - lib_arm/board.c */serial_init, /* 串口通讯设置 - cpu/arm920t/s3c24x0/serial.c */co

8、nsole_init_f, /* 控制台初始化阶段 1 - common/console.c */display_banner, /* 打印 u-boot 信息 - lib_arm/board.c */dram_init, /* 配置可用的 RAM - board/smdk2410/smdk2410.c */display_dram_config, /* 显示 RAM 的配置大小 - lib_arm/board.c */NULL,;void start_armboot (void)/* 顺 序执行 init_sequence 数组中的初始化函数 */for (init_fnc_ptr = in

9、it_sequence; *init_fnc_ptr; +init_fnc_ptr) if (*init_fnc_ptr)() != 0) hang ();/*配置可用的 Flash */size = flash_init ();display_flash_config (size);/* _armboot_start 在 u-boot.lds 链接脚本中定义 */mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);/* 配置 环境 变量*/env_relocate ();/* 从 环境变 量中获取 IP 地址 */gd-bd-bi_ip_add

10、r = getenv_IPaddr (“ipaddr“);/* 以太网接口 MAC 地址 */devices_init (); /* 获取列表中的 设备 */jumptable_init ();console_init_r (); /* 完整地初始化控制台设备 */enable_interrupts (); /* 使能中断 处理 */* 通 过环境 变量初始化 */if (s = getenv (“loadaddr“) != NULL) load_addr = simple_strtoul (s, NULL, 16);/* main_loop()循环不断执行 */for (;) main_lo

11、op (); /* 主循环函数处理执行用户命令 - common/main.c */命令实现U-Boot 作 为 Bootloader,具备多种引导内核启动的方式。常用的 go 和 bootm 命令可以直接引 导内核映像启 动。U-Boot 与内核的关系主要是内核启动过程中参数的传递。1go 命令的实现/* common/cmd_boot.c */int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv)ulong addr, rc;int rcode = 0;if (argc usage);return 1;addr = simp

12、le_strtoul(argv1, NULL, 16);printf (“# Starting application at 0x%08lX .n“, addr);rc = (ulong (*)(int, char )addr) (-argc, /* 运行程序 */if (rc != 0) rcode = 1;printf (“# Application terminated, rc = 0x%lXn“, rc); /*如果是运行 linux,这条指令是否能运行?*/return rcode;go 命令调用 do_go()函数,跳转到某个地址 执行的。如果在这个地址准备好了自引导的内核映像,就

13、可以启动了。尽管 go 命令可以带变参,实际使用时不用来传递参数。2bootm 命令的实现/* common/cmd_bootm.c */int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv) /* 检查头 部 */if (crc32 (0, (uchar *)data, len) != checksum) puts (“Bad Header Checksumn“);SHOW_BOOT_PROGRESS (-2);return 1; /*解 压缩 */switch (hdr-ih_comp) case IH_COMP_NO

14、NE:if(ntohl(hdr-ih_load) = addr) printf (“ XIP %s . “, name); else #if defined(CONFIG_HW_WATCHDOG) | defined(CONFIG_WATCHDOG)size_t l = len;void *to = (void *)ntohl(hdr-ih_load);void *from = (void *)data;printf (“ Loading %s . “, name);while (l 0) size_t tail = (l CHUNKSZ) ? CHUNKSZ : l;WATCHDOG_RESET();memmove (to, from, tail);to += tail;from += tail;l -= tail;#else /* !(CONFIG_HW_WATCHDOG | CONFIG_WATCHDOG) */memmove (void *) ntohl(hdr-ih_load), (uchar *)data, len);

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。