`
java-mans
  • 浏览: 11415837 次
文章分类
社区版块
存档分类
最新评论

宋宝华谈 ARM 的嵌入式 Linux 移植体验之二:BootLoader

 
阅读更多

宋宝华谈 ARM 的嵌入式 Linux 移植体验之二:BootLoader

BootLoader 指系统启动后,在操作系统内核运行之前运行的一段小程序。通过 BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 BootLoader 几乎是不可能的。尽管如此,我们仍然可以对 BootLoader 归纳出一些通用的概念来,以指导用户特定的 BootLoader 设计与实现。
BootLoader 的实现依赖于 CPU 的体系结构,因此大多数 BootLoader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用 C 语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。
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)+-运算


其中的第二个操作数可以是一个立即数:


第二个操作数还可以是位移操作后的结果:


(2)位运算


(3)寄存器搬移


(4)比较


这些指令影响 CPSR 寄存器中的 (N, Z, C, V) 位
(5)内存操作


{..} 可以包括 r0~r15 中的所有寄存器,若包括 r15 (PC)将导致程序的跳转。
(6)控制流
例1:


例2:


3.BootLoader 第一阶段
3.1硬件设备初始化
基本的硬件初始化工作包括:
·屏蔽所有的中断;
·设置 CPU 的速度和时钟频率;
·RAM 初始化;
·初始化 LED
ARM 的中断向量表设置在 0 地址开始的 8 个字空间中,如下表:

ARM的中断向量表
每当其中的某个异常发生后即将 PC 值置到相应的中断向量处,每个中断向量处放置一个跳转指令到相应的中断服务程序去进行处理,中断向量表的程序如下:


复位时关闭看门狗定时器、屏蔽所有中断:


设置系统时钟:


点亮所有的用户 LED:


设置(初始化)内存映射:


设置(初始化)UART:


此外,vivi 还提供了几个汇编情况下通过串口打印字符的函数 PrintChar、PrintWord 和 PrintHexWord:


3.2Bootloader 拷贝
配置为从 NAND FLASH 启动,需要将 NAND FLASH 中的 vivi 代码 copy 到 RAM 中:


3.3进入 C 代码
首先要设置堆栈指针 sp,堆栈指针的设置是为了执行 C 语言代码作好准备。设置好堆栈后,调用 C 语言的 main 函数:


4. BootLoader 第二阶段
vivi Bootloader 的第二阶段又分成了八个小阶段,在 main 函数中分别调用这几个小阶段的相关函数:


STEP1 的 putstr(vivi_banner)语句在串口输出一段字符说明 vivi 的版本、作者等信息,vivi_banner 定义为:


reset_handler 进行相应的复位处理:


hard_reset_handle 会 clear 内存,而软件复位处理则什么都不做:


STEP2 进行板初始化,设置时间和可编程 I/O 口:


STEP3 进行内存映射及 MMU 初始化:


S3C2410A 的 MMU 初始化只需要调用通用的 arm920 MMU 初始化函数:


STEP4 设置堆栈;STEP5 进行 mtd 设备的初始化,记录 MTD 分区信息;STEP6 设置私有数据;STEP7 初始化内建命令。
STEP8 启动一个 SHELL,等待用户输出命令并进行相应处理。在 SHELL 退出的情况下,启动操作系统:


SHELL 中读取用户从串口输出的命令字符串,执行该命令:


5.电路板调试
在电路板的调试过程中,我们首先要在 ADT 新建的工程中添加第一阶段的汇编代码 head.S 文件,修改 Link 脚本,将代码和数据映射到 S3C2410A 自带的 0x40000000 开始的 4KB 内存空间内:


借助万用表、示波器等仪器仪表,调通 SDRAM,并将 vivi 中自带的串口、NAND FLASH 驱动添加到工程中,调试通过板上的串口和 FLASH。如果板电路的原理与三星公司 DEMO 板有差距,则 vivi 中硬件的操作要进行相应的修改。全部调试通过后,修改 vivi 源代码,重新编译 vivi,将其烧录入 NAND FLASH 就可以在复位后启动这个 Bootloader 了。
调试板上的新增硬件时,宜在 ADT 中添加相应的代码,在不加载操作系统的情况下,单纯地操作这些硬件。如果电路板设计有误,要进行飞线和割线等处理。
6.小结
本章讲解了 ARM 汇编、Bootloader 的功能,Bootloader 的调试环境及 ARM 电路板的调试方法。
原文链接:http://dev.yesky.com/6/2527006.shtml

分享到:
评论

相关推荐

    C语言深层探索+ARM linux移植

    基于ARM的嵌入式Linux移植真实体验(2)――BootLoader 91 一道著名外企面试题的抽丝剥茧 106 基于ARM的嵌入式Linux移植真实体验(3)――操作系统 110 基于ARM的嵌入式Linux移植真实体验(4)――设备驱动 119 基于...

    精通ARM嵌入式Linux系统开发1

    全书共25章,从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬件环境的构建、Bootloader、Linux内核移植、嵌入式文件系统、嵌入式Linux多任务程序开发、嵌入式Linux设备驱动...

    基于ARM的嵌入式Linux移植真实体验(2)――BootLoader

    基于ARM的嵌入式Linux移植真实体验(2)――BootLoader基于ARM的嵌入式Linux移植真实体验

    精通ARM嵌入式Linux系统开发代码

    》全书共25章,从嵌入式处理器arm开始,讲解了arm处理器的资源、arm的指令集、ads开发工具、嵌入式系统硬件环境的构建、bootloader、linux内核移植、嵌入式文件系统、嵌入式linux多任务程序开发、嵌入式linux设备...

    精通ARM嵌入式Linux系统开发2

    全书共25章,从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬件环境的构建、Bootloader、Linux内核移植、嵌入式文件系统、嵌入式Linux多任务程序开发、嵌入式Linux设备驱动...

    ARM嵌入式LINUX系统开发详解 第2版 弓雷著.pdf.part1

    第3篇 介绍ARM体系结构及开发实例、深入Bootloader、解析Linux内核、嵌入式Linux启动流程、Linux文件系统、建立交叉编译工具链、命令系统BusyBox、Linux内核移植,以及内核和应用程序调试技术; 第4篇 结合5个案例...

    嵌入式C/C++语言开发精华文章集锦(嵌入式C/C++开发者必看,很有价值的文章)

    基于 ARM 的嵌入式Linux 移植真实体验(2)――BootLoader 基于 ARM 的嵌入式Linux 移植真实体验(3)――操作系统 基于 ARM 的嵌入式Linux 移植真实体验(4)――设备驱动 基于 ARM 的嵌入式Linux 移植真实体验(5...

    ARM嵌入式LINUX系统开发详解 第2版 弓雷著.pdf.part2

    第3篇 介绍ARM体系结构及开发实例、深入Bootloader、解析Linux内核、嵌入式Linux启动流程、Linux文件系统、建立交叉编译工具链、命令系统BusyBox、Linux内核移植,以及内核和应用程序调试技术; 第4篇 结合5个案例...

    ARM-Linux嵌入式系统BootLoader的配置与移植

    ARM-Linux嵌入式系统BootLoader的配置与移植

    精通ARM嵌入式Linux系统开发3

    全书共25章,从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬件环境的构建、Bootloader、Linux内核移植、嵌入式文件系统、嵌入式Linux多任务程序开发、嵌入式Linux设备驱动...

    嵌入式 C C++语言精华文章集锦.pdf

    基于 ARM 的嵌入式 Linux 移植真实体验(2)――BootLoader 96 基于 ARM 的嵌入式 Linux 移植真实体验(3) ――操作系统 111 基于 ARM 的嵌入式 Linux 移植真实体验(4)――设备驱动 120 基于 ARM 的嵌入式 Linux ...

    ARM嵌入式LINUX系统开发详解 第2版 弓雷著.pdf.part3

    第3篇 介绍ARM体系结构及开发实例、深入Bootloader、解析Linux内核、嵌入式Linux启动流程、Linux文件系统、建立交叉编译工具链、命令系统BusyBox、Linux内核移植,以及内核和应用程序调试技术; 第4篇 结合5个案例...

    ARM嵌入式LINUX系统开发详解 第2版 弓雷著.pdf.part5

    第3篇 介绍ARM体系结构及开发实例、深入Bootloader、解析Linux内核、嵌入式Linux启动流程、Linux文件系统、建立交叉编译工具链、命令系统BusyBox、Linux内核移植,以及内核和应用程序调试技术; 第4篇 结合5个案例...

    嵌入式C_C++语言精华文章集锦

    基于ARM 的嵌入式Linux 移植真实体验(2)――BootLoader 基于ARM 的嵌入式Linux 移植真实体验(3)――操作系统 基于ARM 的嵌入式Linux 移植真实体验(4)――设备驱动 基于ARM 的嵌入式Linux 移植真实体验(5)―...

    ARM 嵌入式 Linux 系统开发从入门到精通

    ARM 嵌入式 Linux 系统开发从入门到精通 第 1 章 嵌入式系统开发入门 第 2 章 交叉编译工具链的构建 第 3 章 嵌入式系统的 BOOTLOADER 第 4 章 嵌入式 LINUX 内核移植 第 5 章 ARM LINUX 驱动程序开发入门 第 6 章 ...

    ARM 嵌入式LINUX 系统构建与驱动开发

    2 LINUX 正根的嵌入式系统,LINUX消费与通信领域用的比较多,但缺点是必须ARM9才能跑,ARM9的板子自己做就不行了,6层板太贵。买开发板1K达底吧。但是还是推荐选ARM9+LINUX 3 UCLINUX 算投机嵌入式系统:)ARM7上...

    基于PowerPC的嵌入式Linux

    本书详细地介绍了如何打造一个完整的嵌入式Linux , 主要内容包括: Bootloader 定制、Linux 内核定制、Linux Root fs 定制、Linux 守护进程定制、Linux 设备驱动编程、Linux 编程、实时Linux 扩展等。同时本书结合...

    嵌入式C/C 语言精华文章集锦.rar

    基于ARM 的嵌入式Linux 移植真实体验(2)――BootLoader ...........96 基于ARM 的嵌入式Linux 移植真实体验(3)――操作系统............111 基于ARM 的嵌入式Linux 移植真实体验(4)――设备驱动...............

    基于ARM嵌入式系统的通用Bootloader的设计与实现

    基于ARM的嵌入式系统的通用Bootloader的设计与实现,一个硕士论文,很不错。

    嵌入式Linux开发环境及其在ARM上的移植.ppt

    Linux系统移植的一般步骤:(1)开发环境的搭建(2)系统引导(3)内核引导(4)设备驱动程序(5)文件系统 Binutils工具包 gcc编译器执行过程:预处理(预编译,Preprocessing)编译(Compilation)汇编(Assembly...

Global site tag (gtag.js) - Google Analytics