当前位置:
文档之家› 基于ARM_Linux嵌入式系统引导程序的设计 (1)
基于ARM_Linux嵌入式系统引导程序的设计 (1)
创
图 2 Bootloader 运行流程图
3.1 其中, Bootloader 的 Stage1 通常依次执行以下
新 主要步骤: 3.1.1 硬件设备初始化。
其 目 的 是 为 执 行 Stage2 及 随 后 的 操 作 系 统 Ker-
nel 准备好一些基本的硬件环境。
(a) 建立中断向量表, 当程序出现异常后可跳转到
- 124 - 360元 / 年 邮局订阅号: 82-946
《P LC 技术应用 200 例》
您的论文得到两院院士关注
ARM 开 发 与 应 用
CPU预留的全部 RAM 地 址空间。而是 往往只把 CPU 预 留 的 全 部 RAM 地 址 空 间 中 的 一 部 分 映 射 到 RAM 单元上, 而让剩下的那部分预留 RAM 地址空间处于 未 使 用 状 态 。 如 S3C2410 使 用 的 RAM 空 间 仅 为 0x30000000- 0x33ffffff。
Bootloader 0x00000000
图 1 Flash 中的布局
2 Bootloader 运行流程
系统加电或复位后, 所有的 CPU 通常都从某个由
己的 Bootloader。
1 系统组成
典型的 ARM 嵌入式系统硬件平台一般包括 一个 以 ARM 为内核的处理器、存储器和必要的外部接口 与设备。在本系统中, 采用内嵌 ARM920T 的 Samsung 公司 S3C2410 处理器, 工作频率 200MHz, 存储器使用 2MB 的 Nor Flash 和 64MB 的 SDRAM, 外部接口除 了 用于下载 和通信 的 串 口 , 还 配 备 有 以 太 网 接 口 、USB 接口。
关键词: Bootloader ;S3C2410;引导;嵌入式系统
中 图 分 类 号 : T P 256
文献标识码:A
重 点 阐 述 了 Boot-
Abstr act:In this paper, the concept and fuction of embedded operationg system booting programme- Bootloader is introduced. And I take loading Linux operation system kernel as an example, expatiate on every step and realizing methods of Bootloader running pro- cess particularly. Key wor ds: Bootloader 、S3C2410、Booting、Embedded system.
技
概述
在专用的嵌入式开发板上运行操作系统( 如 Lin- ux) 已经变得越来越流行, 而 Bootloader 就是为引导操 作系统内核运行的一段代码。通过它可以初始化硬件 设 备 、建 立 或 检 测 内 存 空 间 的 映 射 , 其 功 能 有 点 类 似 于 PC 机的 BIOS( 基本输入输出系统) 程序。它的主要 作用是为运行操作系统提供基本的运行环境, 并操作 系 统 的 内 核 装 载 到 存 储 器 ( RAM) 中 的 合 适 位 置 上 去
bl main b _trampoline 3.2.2 初始化本阶段要使用到的硬件设备 这通常包括: 初始化至少一个串口, 以便和终端 用户进行 I/O 输出信息; 初始化计时器等。在初始化这 些设备之前, 也 可以重新把 LED 灯 点 亮 , 以 表 明 我 们 已经进入 main()函数执行。设备初始化完成后, 可以输 出一些打印信息, 程序名字字符串、版本号等。 3.2.3 检测系统的内存映射( Memory map) 所谓内存映射 就是指在整 个 4GB 物理地址 空 间 中 有 哪 些 地 址 范 围 被 分 配 用 来 寻 址 系 统 的 RAM 单 元 。CPU 通 常 预 留 出 一 段 足 够 大 的 地 址 空 间 给 系 统 RAM, 但是在搭建具体的嵌入式系统时不一定会实现
相应子程序执行。如
b ResetAddr ;
b UndefAddr ;handler for Undefined mode 0x4
b SWI_Addr ;handler for SWI interrupt 0x8
b PreAbortAddr ;handler for PreAbort 0xC
b DataAbortAddr ;handler for DataAbort 0x10
由于 Bootloader 的实现依 赖于 CPU 的体系 结 构 , 因 此 Bootloader 功 能 的 实 现 基 本 可 分 为 Stage1 和 Stage2 两 大 部 分 , 分 别 运 行 于 系 统 的 ROM 和 RAM
刘晶晶:硕士研究生
中。依赖于 CPU 体系结构的代码, 比如设备初始化代
入式操作系统内核是嵌入式系统加电运行后的管理
术 平台, 负责实时性任务和多任务的管理。文件系统是 创 嵌入式系统软件平台占用存储量最大的一部分 , 也是
与用户开发最相关的一部分。它存储了系统配置文
新 件、系统程序、用户应用程序和必需的驱动程序。 软
件平台固化在 Flash 中, 通常分为三个区, 具体分布空 间如图 1。
b.
;reserved 0x14
b IRQ_Addr ;handler for IRQ interrupt 0x18
b FIQ_Addr ;handler for FIQ interrupt 0x1C
(b) 屏蔽所有的中断。为中断提供服务通常是操作
系统设备驱动程序的责任, 因此在 Bootloader 的执行
软件平台由以下部分组成: Bootloader、嵌入式操 作系统内核( Kernel) 、文件系统( File system) 。其中, 嵌
ห้องสมุดไป่ตู้
CPU 制造商预先安排的地址上取指 令。比如 Sansung S3C2410 CPU, 在 系 统 加 电 或 复 位 时 就 会 从 地 址 0x00000000 处读取它 的第一条指 令。基于 CPU 构 建 的嵌入式系统则通常都会有某种类型的固态存储设 备(如本例中的 FLASH)被映射到这个预先安排的地址 上, 而 Bootloader 程序一般正是被烧录或者下载到固 态存储设备的 0x00000000 地址处, 因此在系统在加电 或复位后, CPU 将会首先执行 Bootloader 程序。一个典 型简单的 Bootloader 运行流程图如图 2 所示。
等。
(e) 初始化 LED。典型地, 通过 GPIO 来驱动 LED,
其目的是表明系统的状态是正常还是出现错误。
3.1.2 为加载 Stage2 准备 RAM 空间, 拷贝 Stage2 到 RAM 中。
为了获得更快的执行速度, 通常把 Stage2 加载 到 RAM 空 间 中 来 执 行 , 因 此 必 须 为 加 载 Bootloader 的 Stage2 准备好一段可用的 RAM 空间范围。具体的地址 范围可以任意安排, 比如我们习惯将 Stage2 可执行映 像安排到 RAM 地址最 顶部 1MB 开始的 空间内执行 。 拷贝时要确定两点: Stage2 的可执行映像存放在 Flash 中的起始地址和终止地址; 以及 RAM 空间的起始地 址。
File system 0x00200000
运行。本文将以 Samsung 公司的 S3C2410 开发板为开 发平台, 具体阐述了 Bootloader 的运行原理与实现分 析。
Kernel
0x000c0000 0x00010000
Bootloader 程序与 CPU 芯片的内核结构、具体芯 片和使用的操作系统等因素有着密切关系, 因此要为 所有类型的嵌 入式开发板建 立一个通用 的 Bootloader 几乎是不可能的。尽管如此, 本文将尽量对 Bootloader 归纳出一些通用的概念, 以帮助特定用户设计实现自
3.2.4 加 载 内 核 映 像 和 根 文 件 系 统 映 像 并 从 Flash 上拷贝
规划内存占用的布局。这里包括两个方 面: (1)内 核映像所占用的内存范围; ( 2) 根文件系统所占用的 内存范围。对于内核映像, 一般将其拷贝到从 (MEM_START+0x8000) 这个基地址开始的大约 1MB 大小的内存范围内 (嵌入式 Linux 的内核一般 都不超 过 1MB)。从 MEM_START 到 MEM_START+0x8000 这 段 32KB 大小的内存之所以被空 出, 是因为 Linux 内 核要在这段内存中放置一些全局数据结构, 如: 启动 参数和内核页表等信息。而对于根文件系统映像, 则 一般将其拷贝到 MEM_START+0x0010,0000 开始的地 方。若采用 Ramdisk 作为根文 件系统映像 , 则其解压 后的大小一般为 1MB。
《嵌入式系统应用精选 200 例》
邮局订阅号: 82-946 360 元 / 年 - 123 -
ARM 开 发 与 应 用
中 文 核 心 期 刊 《 微 计 算 机 信 息 》( 嵌 入 式 与 S OC )2006 年 第 22 卷 第 2-2 期
码 等 , 通 常 都 放 在 Stage1 中 , 基 本 都 用 汇 编 语 言 来 实 现, 以达到简短精练的目的。而 Stage2 则通常用 C 语 言来实现, 这样可以实现更复杂的功能, 而且代码会 具有更好的可读性和可移植性。
启动/重启
C语 言 入 口 点
定义入口点
初始化关键的输入/输出设备 ( 如中断、串口、LCD)
初始化堆栈指针
打印信息到控制台
配置系统内存映射
建立异常向量表
初始化 C 代码所需的读/写 内存空间
切换处理器到用户模式