arm的bootloader的流程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* #define CONFIG_BOOTARGS "root=ramfs devfs=mount console=ttySAC0,115200" */ #define CONFIG_BOOTARGS "noinitrd root=/dev/bon/2 init=/linuxrc console=ttyS0" #define CONFIG_ETHADDR 08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.15 #define CONFIG_SERVERIP 192.168.1.128 /*#define CONFIG_BOOTFILE "elinos-lart" */ #define CONFIG_BOOTCOMMAND "tftp 30007fc0 z; bootm 30007fc0"
3.RAM 初始化。包括正确地设置系统的内存 控制器的功能寄存器以及各内存库控制寄存器 等。 4.初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通 过初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息来完成这一点。
5. 关闭 CPU 内部指令/数据 cache。
第二的 boot loader ,可以更加形象得被称为 内核加载程序。这个阶段的任务就是加载 linux内核,以及可选的初始化内存盘。 简单说一下bootloader的移植 首先修改 makefile 里的交叉编译器 设定交叉 编 译 器 的 路 径 , 对 于 arm 的 bootloader 选 用 arm-linux-gcc,运行环境是在linux下
Boot Loader 的 stage1 通常包括以下步骤(以执行 的先后顺序): · 硬件设备初始化。 · 为加载 Boot Loader 的 stage2 准备 RAM 空间。 · 拷贝 Boot Loader 的 stage2 到 RAM 空间中。 · 设置好堆栈。 · 跳转到 stage2 的 C 入口点。 Boot Loader 的 stage2 通常包括以下步骤(以执行 的先后顺序): · 初始化本阶段要使用到的硬件设备。 · 检测系统内存映射(memory map)。 · 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 · 为内核设置启动参数。 · 调用内核。
参考Leabharlann Baidu献: Arm9嵌入式linux系统的构建与应用 Bootloader技术内幕
#define CFG_LOAD_ADDR 0x33000000 /* default load address */ #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */ #define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */ #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */
嵌入式系统的bootloader
Bootloader 代码是芯片复位后 进入操作系统之前执行的一段代码,主要 用于完成由硬件启动到操作系统启动的过 渡,从而为操作系统提供基本的运行环境, 如初始化CPU、 堆栈、存储器系统等。 Bootloader 代码与CPU 芯片 的内核结构、具体型号、应用系统的配置 及使用的操作系统等因素有关,其功能类 似于PC机的BIOS程序
嵌入式 Linux 系统 的四个层次
1. 引导加载程序。包括固化在固件(firmware) 中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核 以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram dis k 来作为 root fs。
Boot Loader 的 stage1 这是 Boot Loader 一开始就执行的操作,其目的是 为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以 下步骤(以执行的先后顺序):
1.屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loa der 的执行全过程中可以不必响应任何中断。中断 屏蔽可以通过写 CPU 的中断屏蔽寄存器 或状态寄存器(比如 ARM 的 CPSR 寄存器)来完 成。 2.设置 CPU 的速度和时钟频率。
下载(Downloading)模式:在这种模式下,目标 机上的 Boot Loader 将通过串口连接或 网络连接等通信手段从主机(Host)下载文件,比 如:下载内核映像和根文件系统映像等 。从主机下载的文件通常首先被 Boot Loader 保存 到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。 Boot Loader 的这种模式通常在第一次 安装内核与根文件系统时被使用;此外,以后的系 统更新也会使用 Boot Loader 的这种工 作模式。工作于这种模式下的 Boot Loader 通常都 会向它的终端用户提供一个简单的命令 行接口
启动加载(Boot loading)模式:这种模式 也称为"自主"(Autonomous)模式。也即 Boo t Loader 从目标机上的某个固态存储设备上 将操作系统加载到 RAM 中运行,整个过程 并 没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的 时 侯,Boot Loader 显然必须工作在这种模式 下。
修改后重新编译会生成u-boot.bin二进制文件 一个成功移植后的启动代码: U-Boot 1.1.4 (Jan 14 2006 - 02:09:02) U-Boot code: 33F80000 -> 33F9985C BSS: -> 33F9D970 RAM Configuration: Bank #0: 30000000 64 MB Flash: 1 MB In: serial Out: serial Err: serial Hit any key to stop autoboot: 0
4. 用户应用程序。特定于用户的应用程序。 有时在用户应用程序和内核层之间可能还会 包 括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。
系统的典型构建
Boot Loader 的操作模式 (Operation Mode)
大多数 Boot Loader 都包含两种不同的 操作模式:"启动加载"模式和"下载"模式, 这种区 别仅对于开发人员才有意义。但从最终 用户的角度看,Boot Loader 的作用就是 用来加载 操作系统,而并不存在所谓的启动加载 模式与下载工作模式的区别。
主要修改的文件有
include/configs/2410.h ---- 配置文 件,大部分参数是这里配置的. board/wx/wx20/lowlevel_init.S -内存参数配置 cpu/s3c44b0/serial.c -- 串口配置 cpu/s3c44b0/start.S -- 程序入口 lib_arm /armlinux
smdk2410=> tftp TFTP from server 192.168.1.15; our IP address is 192.168.1.128 Filename 'zImage'. Load address: 0x 33000000
Booting image at 33000000... Image Name: linux-2.6.10 Created: 2006-01-12 20:31:21 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 900588 Bytes = 879.5 kB Load Address: 33000000 Entry Point: 30008000
Boot Loader 的主要任务与典型结构框架 假定内核映像与根文件系统映像 都被加载到 RAM 中运行。之所以提出这样一 个假设前提是因为,在嵌入式系统中内核映像 与根文件系统映像也可以直接在 ROM 或 Flash 这样的固态存储设备中直接运行。但这 种 做法无疑是以运行速度的牺牲为代价的。从操 作系统的角度看,Boot Loader 的总目标就 是正确地调用内核来执行。
比如2410.h里的(摘录;部分) #define CFG_LONGHELP /* undef to save memory */ #define CFG_PROMPT "ARMSYS2410-B # " /* Monitor Command Prompt */ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ #define CFG_MEMTEST_START 0x30000000 /* memtest works on */ #define CFG_MEMTEST_END 0x33F00000 /* 63 MB in DRAM */
由于 Boot Loader 的实现依赖于 CPU 的体系 结构,因此大多数 Boot Loader 都分 为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等, 通常都放在 stage1 中,而且通常都用汇编 语言来实现,以达到短小精悍的目的。而 sta ge2 则通常用C语言来实现,这样可以实现 给复杂的功能,而且代码会具有更好的可读 性和 可移植性。
Boot Loader 所支持的 CPU 和 嵌入式板
每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系 结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于 具体的嵌入式板级设备的配置。这也就是说 ,对于两块不同的嵌入式板而言,即使它们是 基于同一种 CPU 而构建的,要想让运行在一 块板子上的 Boot Loader 程序也能运行在另一 块板子上,通常也都需要修改 Boot Loade r 的源程序。
Verifying Checksum ... OK XIP Kernel Image ... OK ## Transferring control to Linux (at address 30008000) ... Kernel command line is console=ttyS0 root=/dev/nfs nfsroot=192.168.0.101:/armsys2410/root ip=192.168.0.111:192.168.0.1:192.168.0.1:2 55.255.255.0:armsys.hzlitai.com:eth0:off Starting kernel ...