BootLoader指体系发动后,在操作体系内核运转之前运转的一段小程序。经过BootLoader,咱们能够初始化硬件设备、树立内存空间的映射 图,从而将体系的软硬件环境带到一个适宜的状况,以便为终究调用操作体系内核预备好正确的环境。一般,BootLoader是严重地依赖于硬件而完成的, 特别是在嵌入式国际。因而,在嵌入式国际里树立一个通用的 BootLoader 几乎是不可能的。尽管如此,咱们依然能够对BootLoader概括出一些通用的概念来,以辅导用户特定的BootLoader规划与完成。
BootLoader 的 stage1 一般包含以下过程:
·硬件设备初始化;
·为加载Boot Loader的stage2预备 RAM 空间;
·复制Boot Loader的stage2 到RAM空间中;
·设置好仓库;
·跳转到 stage2 的 C 进口点。
Boot Loader的stage2一般包含以下过程:
·初始化本阶段要使用到的硬件设备;
·检测体系内存映射(memory map);
·将kernel 映像和根文件体系映像从flash上读到 RAM 空间中;
·为内核设置发动参数;
·调用内核。
本体系中的BootLoader参照韩国mizi公司的vivi进行修正。
1.开发环境
咱们购买了武汉创维特信息技术有限公司开发的具有自主知识产权的使用于嵌入式软件开发的集成软、硬件开发渠道ADT(ARM Development Tools)它为根据ARM 核的嵌入式使用供给了一整套齐备的开发计划,包含程序修改、工程办理和设置、程序编译、程序调试等。
ADT嵌入式开发环境由ADT Emulator for ARM 和ADT IDE for ARM组成。ADT Emulator for ARM 经过JTAG 完成主机和方针机之间的调试支撑功用。它无需方针存储器,不占用方针体系的任何端口资源。方针程序直接在方针板上运转,经过ARM 芯片的JTAG 鸿沟扫描口进行调试,归于彻底非刺进式调试,其仿真作用挨近实在体系。
ADT IDE for ARM 为用户供给高效清楚的图形化嵌入式使用软件开发环境,包含一整套齐备的面向嵌入式体系的开发和调试东西:源码修改器、工程办理器、工程编译器(编译器、汇 编器和衔接器)、集成调试环境、ADT Emulator for ARM 调试接口等。其界面同Microsoft Visual Studio 环境类似,用户能够在ADT IDE for ARM 集成开发环境中创立工程、翻开工程,树立、翻开和修改文件,编译、衔接、设置、运转、调试嵌入式使用程序。
ADT嵌入式软件开发环境 选用主机-方针机穿插开发模型。ADT IDE for ARM 运转于主机端,而ADT Emulator for ARM 完成ADT IDE for ARM 与方针机之间的衔接。开发时,首先由ADT IDE for ARM 编译衔接生成方针代码,然后树立与ADT Emulator for ARM 之间的调试通道,调试通道树立成功后,就能够在ADT IDE for ARM 中经过ADT Emulator for ARM 操控方针板完成方针程序的调试,包含将方针代码下载到方针机中,操控程序运转,调试信息调查等等。
![]() |
2.ARM汇编
ARM自身归于RISC指令体系,指令条数就很少,而其编程又以C等高档言语为主,咱们仅需要在Bootloader的第一阶段用到少数汇编指令:
(1)+-运算
ADD r0, r1, r2 ―― r0 := r1 + r2 SUB r0, r1, r2 ―― r0 := r1 – r2 |
其间的第二个操作数能够是一个当即数:
ADD r3, r3, #1 ―― r3 := r3 + 1 |
第二个操作数还能够是位移操作后的成果:
ADD r3, r2, r1, LSL #3 ―― r3 := r2 + 8.r1 |
(2)位运算
AND r0, r1, r2 ―― r0 := r1 and r2 ORR r0, r1, r2 ―― r0 := r1 or r2 EOR r0, r1, r2 ―― r0 := r1 xor r2 B%&&&&&% r0, r1, r2 ―― r0 := r1 and not r2 |
(3)寄存器搬移
MOV r0, r2 ―― r0 := r2 MVN r0, r2 ―― r0 := not r2 |
(4)比较
CMP r1, r2 ―― set cc on r1 – r2 CMN r1, r2 ―― set cc on r1 + r2 TST r1, r2 ―― set cc on r1 and r2 TEQ r1, r2 ―― set cc on r1 or r2 |
这些指令影响CPSR寄存器中的 (N, Z, C, V) 位
(5)内存操作
LDR r0, [r1] ―― r0 := mem [r1] STR r0, [r1] ―― mem [r1] := r0 LDR r0, [r1, #4] ―― r0 := mem [r1+4] LDR r0, [r1, #4] ! ―― r0 := mem [r1+4] r1 := r1 + 4 LDR r0, [r1], #4 ―― r0 := mem [r1] r1 := r1 +4 LDRB r0 , [r1] ―― r0 := mem8 [r1] LDMIA r1, {r0, r2, r5} ―― r0 := mem [r1] r2 := mem [r1+4] r5 := mem [r1+8] |
{..} 能够包含r0~r15中的一切寄存器,若包含r15 (PC)将导致程序的跳转。
(6)操控流
例1:
MOV r0, #0 ; initialize counter LOOP: ADD r0, r0, #1 ; increment counter CMP r0, #10 ; compare with limit BNE LOOP ; repeat if not equal |
例2:
CMP r0, #5 ADDNE r1, r1, r0 SUBNE r1, r1, r2 ―― if (r0 != 5) { r1 := r1 + r0 – r2 } |