嵌入式系统bootloader

上传人:206****923 文档编号:51936379 上传时间:2018-08-17 格式:PPT 页数:41 大小:906KB
返回 下载 相关 举报
嵌入式系统bootloader_第1页
第1页 / 共41页
嵌入式系统bootloader_第2页
第2页 / 共41页
嵌入式系统bootloader_第3页
第3页 / 共41页
嵌入式系统bootloader_第4页
第4页 / 共41页
嵌入式系统bootloader_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《嵌入式系统bootloader》由会员分享,可在线阅读,更多相关《嵌入式系统bootloader(41页珍藏版)》请在金锄头文库上搜索。

1、嵌入式系统与bootloader12013年12月18日大庆主要内容2一、嵌入式系统知识二、bootloader Stage1代码浅析一、嵌入式系统知识3Embeded System 一)VxWorks 二)Windows CE 三)嵌入式Linux 四)C/OS一 其它(ecos)41、常见的几种嵌入式系统52、体系结构与内存映射什么是bootloader?6Boot Loader 就是在操作系统内核运行之前运行的一段小程序 。通过这段小程序,我们可以初始化硬件设备、建立内存空间 的映射图,从而将系统的软硬件环境带到一个合适的状态,以 便为最终调用操作系统内核准备好正确的环境。通常,Boot

2、 Loader 是严重地依赖于硬件而实现的,特别是在 嵌入式世界。因此,在嵌入式世界里建立一个通用的Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对Boot Loader 归纳出一些通用的概念来,以指导用户特定的Boot Loader 设计与实现。3、bootloader概念7Bootloader是一段可执行程序,完成的主要功能是将可执行 文件(一般是操作系统)搬移到内存中,然后将控制权交给 这段可执行文件(操作系统)。2、Bootloader概念cpuloaderflashOSmemory OSBootloader的工作模式(一)8 下载模式对研发人员来说,Bootloade

3、r一般需要工作在这 种模式下,特别是调试内核或者Bootloader本身 的时候。 通过串口终端与Bootloader进行交互,可以操作 系统硬件。比如通过网口或者串口下载内核, 烧写Flash等等。2、bootloaderBootloader的工作模式(二)9 启动加载模式 嵌入式产品发布的时候,Bootloader必须工作 在该模式下。这种情况下,Bootloader必须完成硬件自检、 配置,并从Flash中将内核拷贝到SDRAM中,并 跳转到内核入口,实现自启动,而不需要人为 的干预。2、bootloaderBootloader的安装媒介10 系统上电时或复位以后,都从芯片厂商预先安 排

4、的一个地址处取第一条指令执行(如 S3C2410芯片,从0x0处开始)。 由于上电或复位需要运行的第一段程序就是 Bootloader,故必须把Bootloader放入该地址。 将Bootloader写入固态存储设备,永久保存, 系统上电后将自动执行Bootloader。2、bootloaderBootloader的烧写11 Bootloader可以配置系统。没有Bootloader,系统就不能启动。 Bootloader可以实现自烧写。但是系统中没有 还没有Bootloader的时候,怎么启动? JTAG烧写。2、bootloader12bootloader嵌入式系统中常见的Bootload

5、erlVivi lBlob lRedboot lU-Boot(armboot、ppcboot整合)stage1:依赖于CPU体系结构的代码,主 要用汇编来实现。stage2:通常用C语言来实现,这样可以 实现复杂的功能,而且具有更好的可读性 和可移植性。 133、bootloader启动流程二、u-boot Stage1代码浅析14bootloader第一阶段的代码位于cpu/arm920t/start.S中 依次完成以下功能:1、系统上电,进入svc模式 2、关闭看门狗,禁止所有中断 3、进行初级硬件初始化 4、将自身代码拷贝到SDRAM中 5、设置堆栈 6、清空bss段 7、跳转到C语言实

6、现的stage2中154、U-boot启动流程之stage1GOBACK162、启动代码流程GOBACK前期准备17U-boot源码/global 声明一个符号可被其他文档引用,相当于声明了一个全局变量, .globl 和.global 相同。 /该部分为处理器的异常处理向量表。地址范围为0x0000 0000 0x0000 0020,刚好8 条指令。 .globl _start /u-boot 启动入口 _start: b reset /复位向量并且跳转到reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr

7、pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq /中断向量 ldr pc, _fiq /中断向量GOBACK前期准备18U-boot源码/ .word 伪操作用于分配一段字内存单元(分配的单元都是字对齐的),并用伪操作中的 expr 初始化。.long 和.int 作用与之相同。_undefined_instruction: .word undefined_instruction _software_interrupt: .word software_interrupt _prefetch_abort

8、: .word prefetch_abort _data_abort: .word data_abort _not_used: .word not_used _irq: .word irq _fiq: .word fiq前期设置19U-boot源码/ .align 伪操作用于表示对齐方式:通过添加填充字节使当前位置满足一定 的对齐方式。.balign 的作用同.align。 / .align alignment ,fill ,max / 其中:alignment 用于指定对齐方式,可能的取值为2 的次幂,缺省为4 。fill 是填充内容,缺省用0 填充。max 是填充字节数最大值,假如填充字节

9、数超过max, / 就不进行对齐,例如: / .align 4 /* 指定对齐方式为字对齐 */ .balignl 16,0xdeadbeef20U-boot源码/* * * * * Startup Code (reset vector) * * do important init only if we dont start from memory! * relocate armboot to ram * setup stack * jump to second stage * * * */前期定义21U-boot源码/ TEXT_BASE 在研发板相关的目录中的config.mk 文档中定义

10、, 他定义了 / 代码在运行时所在的地址, 那么_TEXT_BASE 中保存了这个地址 _TEXT_BASE: .word TEXT_BASE / 声明 _armboot_start 并用 _start 来进行初始化,在board/u-boot.lds 中定义。 .globl _armboot_start _armboot_start: .word _start22U-boot源码/* * These are defined in the board-specific linker script. */ / 声明_bss_start 并用_bss_start 来初始化,其中_bss_start

11、 定义在和板相关的u-boot.lds 中。 / _bss_start 保存的是_bss_start 这个标号所在的地址, 这里涉及到当前代码所在 / 的地址不是编译时的地址的情况, 这里直接取得该标号对应的地址, 不受编译时 / 地址的影响. _bss_end 也是同样的道理. .globl _bss_start _bss_start: .word _bss_start / 同上 .globl _bss_end _bss_end: .word _end#ifdef CONFIG_USE_IRQ /* IRQ stack memory (calculated at run-time) */ .

12、globl IRQ_STACK_START IRQ_STACK_START: .word 0x0badc0de /* IRQ stack memory (calculated at run-time) */ .globl FIQ_STACK_START FIQ_STACK_START: .word 0x0badc0de #endif(1)设置CPU启动模式23U-boot源码/*the actual reset code*/ / MRS Rd,CPSR|SPSR 将CPSR|SPSR 传送到Rd / 使用这两条指令将状态寄存器传送到一般寄存器,只修改必要的位,再将结果传送回状态寄 存器,这样能

13、够最好地完成对CRSP 或SPSR 的修改 / MSR CPSR_|SPSR_,Rm 或是 MSR CPSR_f|SPSR_f,# / MRS 和MSR 配合使用,作为更新PSR 的“读取修改写回”序列的一部分 / bic r0,r1,r2 ;r0:=r1 and not r2 / orr ro,r1,r2 ;r0:=r1 or r2 / 这几条指令执行完毕后,进入SVC32 模式,该模式主要用来处理软件中断(SWI) reset: /* * set the cpu to SVC32 mode */ mrs r0,cpsr /将CPSR 状态寄存器读取,保存到R0 中 bic r0,r0,#0

14、x1f orr r0,r0,#0xd3 msr cpsr,r0 /将R0 写入状态寄存器中 GO_S1(2)A关闭看门狗24U-boot源码/* turn off the watchdog */ /关闭看门狗 #if defined(CONFIG_S3C2400) # define pWTCON 0x15300000 # define INTMSK 0x14400008 /* Interupt-Controller base addresses */ # define CLKDIVN 0x14800014 /* clock divisor register */ #elif defined(C

15、ONFIG_S3C2410) # define pWTCON 0x53000000 # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ # define INTSUBMSK 0x4A00001C # define CLKDIVN 0x4C000014 /* clock divisor register */ #endif #if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410) ldr r0, =pWTCON mov r1, #0x0 str r1, r0GO_S1(2)B禁止所有中断25U-boot源码/* * mask all IRQs by setting all bits in the INTMR - default */ /关闭所有中断 mov r1, #0xffffffff ldr r0, =INTMSK str r1, r0 # if defined(CONFIG_S3C2410) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, r0 # endif /* FCLK:HCLK:PCLK = 1:2:4 */ /* default

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号