陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009
Boot Loader 本章从以下四个方面来讨论嵌入式系统的 Boot Loader,包括: Boot Loader 的概念 2018/11/16 嵌入式操作系统
嵌入式Linux的软件层次 在专用的嵌入式板子上运行 GNU/Linux 系统已变得越来越流行。 引导加载程序。 包括固化在固件(firmware)中的 boot 代码(可选)和 Boot Loader 两大部分 Linux内核。 特定于嵌入式板子的定制内核及内核的启动参数 2018/11/16 嵌入式操作系统
嵌入式Linux的软件层次(cont’d) 文件系统。 包括根文件系统和建立于 Flash 内存设备之上的文件系统 通常用RAM-Disk来作为根文件系统 用户应用程序。 特定于用户的应用程序 2018/11/16 嵌入式操作系统
嵌入式GUI 有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面(GUI)。 常用的嵌入式 GUI 有: MicroWindows 和 MiniGUI等。 2018/11/16 嵌入式操作系统
引导加载程序 引导加载程序是系统加电后运行的第一段软件代码 例如PC 机的引导加载程序,包括 BIOS(其本质就是一段固件程序) 位于硬盘 MBR 中的 OS Boot Loader 比如LILO、GRUB 等。 BIOS的主要任务是 进行硬件检测和资源分配 将MBR中的OS Boot Loader读到系统的 RAM 中 将控制权交给 OS Boot Loader Boot Loader 的主要运行任务是 将内核映象从硬盘上读到 RAM 中 跳转到内核的入口点去运行,也即启动操作系统。 2018/11/16 嵌入式操作系统
引导加载程序(cont’d) 在嵌入式系统中 通常并没有像 BIOS 那样的固件程序 注:有的嵌入式 CPU 也会内嵌一段短小的启动程序 整个系统的加载启动任务完全由 Boot Loader 完成 如在一个基于 ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。 2018/11/16 嵌入式操作系统
Boot Loader 的概念 Boot Loader 是在操作系统内核运行之前运行的第一段小程序。 初始化硬件设备 建立内存空间的映射图 将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 加载操作系统内核映象到RAM中,并将系统的控制权传递给它 例如:Linux 2018/11/16 嵌入式操作系统
通用的Boot Loader 在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的 2018/11/16 嵌入式操作系统
支持的 CPU 和嵌入式板 Boot Loader依赖于 CPU 的体系结构 具体的嵌入式板级设备的配置 例如U-Boot同时支持ARM和MIPS体系结构 具体的嵌入式板级设备的配置 对于两块不同的嵌入式板,即使它们基于同一种 CPU,要想让运行在一块板子上的 Boot Loader也能运行在另一块板子上,通常也都需要修改 Boot Loader源程序 2018/11/16 嵌入式操作系统
Boot Loader 的安装媒介 系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。 比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。 基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备被映射到该预先安排的地址上。 比如:ROM、EEPROM 或 FLASH 等 因此:在系统加电后,CPU 将首先执行 Boot Loader 程序。 2018/11/16 嵌入式操作系统
固态存储设备的 典型空间分配结构图 一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图 Kernel Root filesystem Bootloader Boot parameters 2018/11/16 嵌入式操作系统
Boot Loader 的安装 烧写boot loader程序 一般通过jtag烧写 需要jtag连接器和PC端的烧写程序 2018/11/16 嵌入式操作系统
控制 Boot Loader 的设备或机制 主机和目标机之间一般通过串口建立连接 Boot Loader 在执行时常通过串口来进行 I/O,比如 输出打印信息到串口 从串口读取用户控制字符等。 最常用的串口通信软件 Linux:minicom Windows:附件中的超级终端 2018/11/16 嵌入式操作系统
Boot Loader 的启动过程 Boot Loader的启动过程可以是 单阶段(Single Stage)或 多阶段(Multi-Stage) 通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性 从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage1 和 stage2 两部分 2018/11/16 嵌入式操作系统
Boot Loader 的操作模式 大多数 Boot Loader 包含两种不同的操作模式 这种区别仅对于开发人员才有意义 启动加载(Boot loading)模式和 下载(Downloading)模式 这种区别仅对于开发人员才有意义 从最终用户的角度看,Boot Loader 的作用就是加载操作系统,并不存在上述两种模式的区别 2018/11/16 嵌入式操作系统
启动加载模式 也称为自主(Autonomous)模式 Boot Loader从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户(开发人员)的介入。 这种模式是 Boot Loader 的正常工作模式 在嵌入式产品发布时,Boot Loader必须工作在该模式下 2018/11/16 嵌入式操作系统
下载模式 目标机的 Boot Loader通过串口或网络等通信手段从主机(Host)下载文件 该模式的使用时机 比如内核映像和根文件系统映像 Hosttarget ram target FLASH 该模式的使用时机 通常在第一次安装内核与根文件系统时被使用 也用于此后的系统更新 工作于该模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口 从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中 2018/11/16 嵌入式操作系统
Boot Loader 的操作模式(cont’d) 同时支持这两种工作模式 如Blob和U-Boot 允许用户在这两种工作模式之间进行切换 比如,Blob 在启动时处于正常的启动加载模式,但是它会延时 10 秒等待终端用户按下任意键而将 blob 切换到下载模式。如果在 10 秒内没有用户按键,则 blob 继续启动 Linux 内核。 2018/11/16 嵌入式操作系统
与boot loader两种模式相关的问题 uClinux包编译好后,可根据需要编译出各种镜像文件 也就是按照板子内存预定位置生成的二进制映象,一般是内核和文件系统的复合体 常见有 image.ram(常称为ram版内核)和 image.rom(常称为rom版内核) 通过在make时指定的不同编译选项生成 2018/11/16 嵌入式操作系统
ram版内核 一般不压缩,通过boot loader加载到目标板内存的指定位置,然后可用boot loader跳转过去就把uclinux引导启动了 Boot loader+ram版内核 内核/驱动相关调试期间常用方式 先把很小,通常几十KB的bootloader通过jtag烧写到flash。然后每次上电或reset后bootloader启动,然后可以选择加载ram版到sdram,启动uclinux,进行调试。调试过程中碰到死机,就再reset,再下载ram版内核到sdram,然后启动uclinux 2018/11/16 嵌入式操作系统
rom版内核 不严格的理解可以说是把boot loader+ram版烧写到flash内 上电或reset后首先执行boot loader初始化硬件功能,然后把压缩的内核映象解压释放到SDRAM指定地址,接着自动引导内核,启动uClinux 调试应用软件常用rom版镜像。 把调试好的rom版镜像用烧写到flash。这样就不需要bootloader,也不用每次都加载ram版到sdram了,每次上电直接进入uclinux,可以通过nfs mount调试应用程序。 2018/11/16 嵌入式操作系统
BootLoader 与主机之间进行文件传输所用的通信设备及协议 最常见通信设备是串口 传输协议通常是 xmodem、ymodem、zmodem之一。 但串口传输的速度有限 更好的选择是以太网 使用TFTP 协议 主机方必须有一个软件提供 TFTP 服务 最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输 通过以太网连接并借助 TFTP 协议来下载文件 2018/11/16 嵌入式操作系统
系统假设:内核映像与根文件系统映像都被加载到 RAM 中运行。 Boot Loader的主要任务 系统假设:内核映像与根文件系统映像都被加载到 RAM 中运行。 尽管在嵌入式系统中它们也可直接运行在 ROM 或 Flash这样的固态存储设备中。但这种做法无疑是以运行速度的牺牲为代价的。 从操作系统的角度看,Boot Loader 的总目标就是正确地加载并调用内核来执行。 2018/11/16 嵌入式操作系统
Boot Loader的典型结构框架 由于 Boot Loader 的实现依赖于 CPU 体系结构,大多数 Boot Loader 都分为 stage1 和 stage2 两大部分 Stage1 依赖于 CPU 体系结构,如设备初始化代码 通常用汇编语言实现,短小精悍 Stage2 通常用C语言 可以实现复杂功能 代码具有较好的可读性和可移植性 2018/11/16 嵌入式操作系统
Boot Loader的stage1 Stage1直接运行在固态存储设备上,通常包括以下步骤 硬件设备初始化 为加载 Boot Loader的stage2准备RAM空间 拷贝 Boot Loader的stage2到RAM 空间中 设置好堆栈 跳转到 stage2 的 C 入口点 2018/11/16 嵌入式操作系统
Stage1:硬件初始化 这是 Boot Loader 一开始就执行的操作 目的:为 stage2及kernel的执行准备好基本硬件环境 通常包括 屏蔽所有的中断 为中断提供服务通常是 OS或设备驱动程序的责任,在 Boot Loader阶段不必响应任何中断 中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器来完成 比如 ARM 的 CPSR 寄存器 2018/11/16 嵌入式操作系统
Stage1:硬件初始化(cont‘d) 设置 CPU 的速度和时钟频率 RAM 初始化 初始化 LED 包括正确地设置系统中内存控制器的功能寄存器以及各CPU外的内存(Memory Bank)的控制寄存器等。 初始化 LED 典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。若板子上无LED,也可通过初始化UART向串口打印Boot Loader的 Logo字符信息来完成这一点。 关闭 CPU 内部指令/数据 cache 2018/11/16 嵌入式操作系统
Stage1:为stage2 准备 RAM 空间 为获得更快的执行速度,通常stage2被加载到 RAM 中执行 空间大小,应考虑 stage2 可执行映象的大小+堆栈空间 因为stage2 通常是 C 语言代码 此外,最好对齐到memory page大小(通常是 4KB) 一般而言1MB已足够 2018/11/16 嵌入式操作系统
Stage1:为stage2 准备 RAM 空间 具体的地址范围可以任意安排 比如 blob 将它的 stage2 可执行映像安排系统的RAM中0xc0200000开始的1M 空间内 值得推荐的是 可以将 stage2 安排到整个RAM空间的最顶1MB 也即(RamEnd-1MB)开始处 假设 空间大小:stage2_size(字节) 起始和终止地址分别为:stage2_start 和 stage2_end(均与4 字节对齐) 则有:stage2_end=stage2_start+stage2_size 2018/11/16 嵌入式操作系统
Stage1:为stage2准备RAM空间 必须确保所安排的地址范围的确为可读写的 RAM 空间,即必须进行有效性测试 Blob的内存有效性测试方法: 记为test_mempage: 以内存页为被测单位,测试每个页面头两个字是否可读写 2018/11/16 嵌入式操作系统
test_mempage 1. 保存被测页面头两个字的内容。 2. 向这两个字中写入任意的数字。比如:向第一个字写入 0x55,第 2 个字写入 0xaa。 3. 立即将这两个字的内容读回。应当与写入的内容一致,否则此页面地址范围不是一段有效的 RAM 空间 4. 再次向这两个字中写入任意的数字。比如:向第一个字写入 0xaa,第 2 个字中写入 0x55。 5. 立即将这两个字的内容读回。判断依据同3 6. 恢复这两个字的原始内容。 2018/11/16 嵌入式操作系统
Stage1:为stage2准备RAM空间 测试结束后,为了得到一段干净的 RAM 空间范围,可以将所安排的 RAM 空间范围进行清零操作。 2018/11/16 嵌入式操作系统
Stage1:拷贝 stage2 到 RAM 中 拷贝时要确定: Stage2的可执行映象在固态存储设备的存放起始地址和终止地址 2018/11/16 嵌入式操作系统
Stage1:设置堆栈指针 sp 对C 语言编写的程序应当准备运行堆栈 通常设置在上述1MB RAM 空间的最顶端 sp=(stage2_end-4) 注:堆栈是向下生长的 此外,在设置堆栈指针前,也可关闭 led 灯,以提示用户即将跳转到 stage2。 stage2 通常是 C 语言执行代码,因此必须为stage2的代码运行准备堆栈 2018/11/16 嵌入式操作系统
系统的物理内存布局 经过上述步骤后,系统的物理内存布局应该如下图所示 2018/11/16 嵌入式操作系统 此时系统的物理内存布局应该如下图所示 2018/11/16 嵌入式操作系统
Stage1:跳转到 stage2 的 C 入口点 在上述一切都就绪后,就可以跳转到 Boot Loader 的 stage2 去执行了。 比如,在 ARM 系统中,这可以通过修改 PC 寄存器为合适的地址来实现 2018/11/16 嵌入式操作系统
关于C入口点的疑惑 stage2 的代码通常用 C 语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。 但是与普通 C 语言应用程序不同的是,在编译和链接 boot loader 这样的程序时,不能使用 glibc 库中的任何支持函数。 其原因是显而易见的。??? 那么从哪里跳转进 main() 函数呢? 2018/11/16 嵌入式操作系统
直接使用main函数的起始地址 最直接的想法就是 直接把 main() 函数的起始地址作为整个 stage2 执行映像的入口点? 2018/11/16 嵌入式操作系统
trampoline(弹簧床)的概念 一种更为巧妙的方法是利用 trampoline(弹簧床)的概念。 用汇编语言写一段trampoline 小程序,并将它来作为 stage2 可执行映象的执行入口点。 在 trampoline中用 CPU 跳转指令跳入 main() 函数中去执行; 当 main() 函数返回时,CPU 执行路径显然再次回到trampoline 程序。 简而言之:用这段 trampoline 小程序作为 main() 函数的外部包裹(external wrapper)。 2018/11/16 嵌入式操作系统
一个简单的 trampoline 程序示例(来自blob bootloader): .text .globl _trampoline _trampoline: bl main /* if main ever returns we just call it again */ b _trampoline 可以看出,当 main() 函数返回后,我们又用一条跳转指令重新执行 trampoline 程序――当然也就重新执行 main() 函数,这也就是 trampoline(弹簧床)一词的意思所在。 2018/11/16 嵌入式操作系统
Boot Loader的stage2 通常包括以下步骤 初始化本阶段要使用到的硬件设备 检测系统内存映射(memory map) 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中 为内核设置启动参数 调用内核 2018/11/16 嵌入式操作系统
Stage2:初始化要用的硬件设备 这通常包括: 在初始化这些设备之前,也可重新把 LED 灯点亮,以表明已进入 main() 函数执行 初始化至少一个串口,以便和终端用户进行 I/O 输出信息; 初始化计时器等。 在初始化这些设备之前,也可重新把 LED 灯点亮,以表明已进入 main() 函数执行 设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。 2018/11/16 嵌入式操作系统
Stage2:检测系统内存映射 所谓内存映射就是指 在整个 4GB 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM 单元。比如, SA-1100 CPU 中,从 0xC000,0000 开始的 512M 被用作系统的 RAM 地址空间 Samsung S3C44B0X CPU 中,从 0x0c00,0000 到 0x1000,0000 间的 64M 被用作系统的 RAM 地址空间 2018/11/16 嵌入式操作系统
CPU预留的地址空间 VS. 实际使用的地址空间 虽然 CPU 通常预留出一大段足够的地址空间给系统 RAM,但是在搭建具体的嵌入式系统时却不一定会实现 CPU 预留的全部 RAM 地址空间。 也即具体的嵌入式系统往往只把 CPU 预留的全部 RAM 地址空间中的一部分映射到 RAM 单元上,而让剩下的那部分预留 RAM 地址空间处于未使用状态。 2018/11/16 嵌入式操作系统
也即它必须知道 CPU 预留的全部 RAM 地址空间中的哪些被真正映射到 RAM 地址单元,哪些是处于 "unused" 状态的。 因此 Boot Loader 的 stage2 必须在它想干点什么 (比如,将存储在 flash 上的内核映像读到 RAM 空间中) 之前检测整个系统的内存映射情况 也即它必须知道 CPU 预留的全部 RAM 地址空间中的哪些被真正映射到 RAM 地址单元,哪些是处于 "unused" 状态的。 2018/11/16 嵌入式操作系统
内存映射的描述 如下数据结构用来描述 RAM 地址空间中的一段连续的地址范围: used=0|1 type struct memory_area_struct { u32 start; //内存区域的起始地址 u32 size; //内存区域的大小(字节数) int used; //内存区域的状态 } memory_area_t; used=0|1 1=这段地址范围已被实现,也即真正地被映射到 RAM 单元上 0=这段地址范围并未被系统所实现,处于未使用状态。 数据结构将CPU预留的空间表示出来 一段内存区域的状态有两种: 使用=1;表示这段内存区域是CPU预留的,并且已经被真正的映射到RAM单元上; 未使用=0;表示这段内存区域虽然是CPU预留的,但是没有被真正的映射到RAM单元上 2018/11/16 嵌入式操作系统
内存映射的描述 整个 CPU 预留的 RAM 地址空间可以用一个 memory_area_t 类型的数组来表示,如 memory_area_t memory_map[NUM_MEM_AREAS]= { [0…(NUM_MEM_AREAS)]= .start=0, .size=0, .used=0 //表示检测内存映射之前的初始状态 }, }; 伪代码??? 2018/11/16 嵌入式操作系统
内存映射检测算法(代码) 数组初始化,每个区域的used标志设为0 将整个空间中所有页面的前32位(4个字节)写为0 依次检测每个页面是否有效(使用test_mempage算法) 若当前页面无效 若当前区域已映射,则当前区域检测结束 若当前页面有效 判断该页面是否由其他页面映射而来,若是同3.1 否则若当前区域已映射,则增加有效页面到当前区域中 若当前区域为一个新的区域,则初始化该区域并增加当前页面到当前区域中 3.3 2018/11/16 嵌入式操作系统
在用上述算法检测完系统的内存映射情况后,Boot Loader 也可以将内存映射的详细信息打印到串口。 2018/11/16 嵌入式操作系统
Stage2:加载映像 主要考虑基地址和映像的大小,例如: 规划内存占用的布局,包括 内核映像所占用的内存范围; 根文件系统所占用的内存范围。 主要考虑基地址和映像的大小,例如: 对内核映像,一般考虑从(MEM_START+0x8000) 开始约1MB的内存范围内 嵌入式 Linux 的内核一般都不操过 1MB。 为什么要把从 MEM_START 到 MEM_START+0x8000 这段 32KB 大小的内存空出来呢?这是因为 Linux 内核要在这段内存中放置一些全局数据结构,如:启动参数和内核页表等信息。 2018/11/16 嵌入式操作系统
对根文件系统映像,一般从 MEM_START+0x0010,0000 开始。如果用 Ramdisk 作为根文件系统映像,则其解压后的大小一般是1MB。 加载映像:从 Flash 上拷贝 像 ARM 这样的嵌入式 CPU 通常都在统一的内存地址空间中寻址 Flash 等固态存储设备 从 Flash 上读取数据与从 RAM 单元中读取数据并没有什么不同。用一个简单的循环就可完成从 Flash 设备上拷贝映像的工作 2018/11/16 嵌入式操作系统
从 Flash 上拷贝 while(count) { *dest++ = *src++; /* they are all aligned with word boundary */ count -= 4; /* byte number */ }; 2018/11/16 嵌入式操作系统
Stage2:设置内核的启动参数 在嵌入式Linux系统中,需要由boot_loader设置的参数有: 内核参数,如页面大小、根设备 内存映射情况 命令行参数 initrd映像参数 起始地址,大小 Ramdisk参数 解压后的大小 在将内核映像和根文件系统映像拷贝到 RAM 空间中后,应该作一步准备工作: 设置 Linux 内核的启动参数 2018/11/16 嵌入式操作系统
Stage2:调用内核 调用方法: 对于ARM Linux系统,在跳转之前必须满足: Cache 和 MMU 的设置: 直接跳转到内核的第一条指令处,也即RAM中内核被加载的地址处 对于ARM Linux系统,在跳转之前必须满足: CPU 寄存器的设置: R0=0; R1=机器类型 ID; R2=传递给内核的启动参数起始地址; CPU 模式: 必须禁止中断(IRQs和FIQs); CPU必须处于SVC 模式; Cache 和 MMU 的设置: MMU 必须关闭; 指令 Cache 可以打开也可以关闭; 数据 Cache 必须关闭; Boot Loader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到RAM中内核被加载的地址处 关于 Machine Type Number,可以参见 linux/arch/arm/tools/mach-types 2018/11/16 嵌入式操作系统
BootLoader的工作到此为止 从此操作系统接管所有的工作 2018/11/16 嵌入式操作系统
开源的Boot Loader ARMboot PPCBoot u-Boot Red Boot blob OpenBIOS FreeBIOS LinuxBIOS 目前,ARMboot已经和PPCBoot合并到U-Boot中 2018/11/16 嵌入式操作系统
U-boot简介
u-boot (Universal Boot) uboot是在ppcboot 以及armboot 的基础上发展而来 支持很多处理器,比如PowerPC、ARM、MIPS和 x86。 最新的主页:http://www.denx.de/wiki/U-Boot 源代码: 2018/11/16 嵌入式操作系统
u-boot的使用 U-boot的手册 1)安装交叉开发环境ELDK:Embedded Linux Development Kit 2)通过串口/网络连接到目标端 3)配置、编译并安装u-boot 4)配置、编译并安装Linux 该手册使用SELF:Simple Embedded Linux Framework 2018/11/16 嵌入式操作系统
编译u-boot 设置正确的交叉编译器 arm-elf- 或者 arm-linux- 对于arm体系结构,u-boot 1.2.0中缺省使用arm-linux- 2018/11/16 嵌入式操作系统
可以根据需要修改,在include/configs/ep7312.h中 2018/11/16 嵌入式操作系统
U-boot的缺省启动方式 2018/11/16 嵌入式操作系统
修改结束后,配置并编译 make ep7312_config sudo make all 2018/11/16 嵌入式操作系统
在skyeye中运行u-boot 编写skyeye.conf Skyeye –c skyeye.conf –e u-boot 由于u-boot限时自动boot,所以在run之后要立刻使用“回车”键阻止autoboot 2018/11/16 嵌入式操作系统
进入u-boot的界面 2018/11/16 嵌入式操作系统
U-boot源码介绍 以u-boot 1.2.0为例 阅读README 阅读根目录下的Makefile 了解目录结构 了解配置和编译命令 知道在什么地方可以找到配置文件中的各个配置信息的含义 阅读根目录下的Makefile 了解配置和编译过程 了解编译的产物有哪些 了解目标映像的结构 知道u-boot的启动文件:start.S 2018/11/16 嵌入式操作系统
其他boot loader
RedBoot简介 RedHat Embedded Debug and Bootstrap 支持ARM系列、MIPS系列、PPC系列等平台 基于eCos操作系统 eCos 是个可配置的操作系统 RedBoot是从eCos配置而来 支持ARM系列、MIPS系列、PPC系列等平台 具有较高的可移植性 移植的重点是其体系结构平台相关层 参考:http://blog.chinaunix.net/u2/78437/showart_1354528.html 2018/11/16 嵌入式操作系统
Ecos架构 2018/11/16 嵌入式操作系统 http://lh6.ggpht.com/rolle.xu/SDaAqa9yypI/AAAAAAAAAEw/jUYE6htfVNY/s800/ecos.jpg
RedBoot架构 2018/11/16 嵌入式操作系统 http://lh5.ggpht.com/rolle.xu/SDaAqK9yyoI/AAAAAAAAAEo/eNK6Vz1uOeY/s800/redboot.jpg
获得RedBoot 使用cvs下载ecos,编译,配置得到redboot 与IXP4XX相关的RedBoot,可以从以下链接下载: 参考网站http://ecos.sourceware.org/anoncvs.html 与IXP4XX相关的RedBoot,可以从以下链接下载: ftp://ftp.ges.redhat.com/private/gnupro-xscale-030422/redboot-intel-ixp4xx-050425.tar.gz 下载:ftp://ecos.sourceware.org/pub/ecos/ecos-install.tcl 运行: sh ecos-install.tcl 在运行中,会下载交叉编译工具,选择arm-elf 注:这种方法得到的ecos貌似不支持ixdp425 2018/11/16 嵌入式操作系统
RedBoot的命令 alias alias {name} [value] baudrate baudrate [-b rate] 约30个 alias alias {name} [value] baudrate baudrate [-b rate] cache cache [on | off] channel :select the system console channel channel [-l | channel_number] cksum cksum {-b location} {-l length} disks :list available disk partitions dump …… 2018/11/16 嵌入式操作系统
配置RedBoot (采用ecos-install.tcl方案)下载ecos 使用配置工具 ecosconfig 建立一个新的目录,在新的目录下执行下列命令 ecosconfig new TARGET redboot ecosconfig import hal/…../*.ecm ecosconfig tree Make 以TARGET为eb40为例 http://redboot.blogbus.com/logs/19874250.html 若遇到tail报错:找到相应目录下的makefile,找到tail命令行,添加-n 在配置过程中,会出现ecos.ecc文件, 是当前任务的配置文件 ecc 是eCos Configuration的缩写 2018/11/16 嵌入式操作系统
考察redboot-intel-ixp4xx-050425.tar.gz 在文档目录下有redboot的用户手册 2018/11/16 嵌入式操作系统
重新建立ixp425的redboot 将redboot-intel-ixp4xx-050425解压缩到上述ecos目录下 修改ecosenv.sh文件 运行 . ecosenv.sh,添加环境变量和相关工具路径 安装xscale-elf交叉编译器 i686-pc-linux-gnulibc2.2-x-xscale-elf.tar.Z 解压缩,并将其bin目录添加到PATH中 配置并make(方法同前) 最好将路径放在PATH的前面 2018/11/16 嵌入式操作系统
阅读redboot 参考文献: The eCos Component Writer's Guide Packages目录的层次结构 2018/11/16 嵌入式操作系统
Language目录中提供一些语言支持库,例如C库 Hal目录是体系结构相关部分 Io目录中是一些驱动 Language目录中提供一些语言支持库,例如C库 template是指为某种目的build而建立的相应模板配置,比如选取一些包,配置一些选项等等 ecos.db是一个数据库文件,配置工具从这个文件中获得各种信息 观察ecos.db 从两个ecos.db的差别了解ecos.db的作用 2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
Package版本 一般,current目录是最新的 2018/11/16 嵌入式操作系统 The version current is special. Typically it corresponds to the very latest version of the sources, obtained by anonymous CVS. 一般,current目录是最新的 2018/11/16 嵌入式操作系统
体系结构相关的通用目录结构 对照ixdp425 2018/11/16 嵌入式操作系统
源文件 库源文件 链接描述文件 外部头文件 文档 测试用例 CDL脚本 ChangeLog 2018/11/16 嵌入式操作系统 http://blog.21ic.com/user1/3820/archives/2007/36508.html 2018/11/16 嵌入式操作系统
Ixdp425相关 vectors.S启动相关 2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
CDL脚本,the component definition language 平台启动相关代码。主要用ARM汇编写, 实现平台上电后程序的启动和执行 中断配置 存储空间配置文件 IO名称 2018/11/16 嵌入式操作系统
启动流程 vector.S : reset_vector Hal_platform_setup.h vectro.S : start Main.c : cyg_start 2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
hal_platform_setup.h 2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
vector.S 2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
Redboot的main.c 2018/11/16 嵌入式操作系统
推荐参考网站 http://redboot.blogbus.com http://blog.21ic.com/user1/3820/archives/2007/36508.html http://blog.chinaunix.net/u2/62910/showart_491976.html http://linux.chinaunix.net/techdoc/net/2007/01/16/948301.shtml 2018/11/16 嵌入式操作系统
ARMboot的分析和使用
ARMboot ARMboot属于自由软件,http://armboot.sourceforge.net/ 是针对ARM CPU编写的通用Boot Loader,其作用是 对CPU以及主板进行初始化 加载操作系统或者其他boot image 支持目前市面上的多种ARM板,也可以很容易的移植到新的开发板上 目前ARMboot已经与PPCBoot合并u-boot 支持PPC、ARM等多种CPU 2018/11/16 嵌入式操作系统
ARMboot 加载Boot Image的方式 本地Flash设备 JFFS2文件系统 IDE设备 网络 串口传输 在程序开发调试阶段,一般采用网络加载方式,可以极大地加快开发速度 2018/11/16 嵌入式操作系统
下载并安装ARMboot Armboot源码公开,可以在http://sourceforge.net/projects/armboot上下载 解压缩 tar –zxf armboot-1.1.0.tgz 看README 2018/11/16 嵌入式操作系统
为了使用arm-elf-打头的交叉编译命令,需要修改armboot-1. 1 为了使用arm-elf-打头的交叉编译命令,需要修改armboot-1.1.0/Makefile中的CROSS_COMPILE变量的值arm-linux-为arm-elf- 或者安装arm-linux-交叉编译包 2018/11/16 嵌入式操作系统
安装arm-linux-交叉编译包 下载cross-2.95.3.tar.bz2 这就有了一个arm-linux-交叉编译环境了 mkdir –p /usr/local/arm cd /usr/local/arm tar jxf cross-2.95.3.tar.bz2 这就有了一个arm-linux-交叉编译环境了 修改.bashrc,添加 export PATH=$PATH:/usr/local/arm/2.95.3/bin 2018/11/16 嵌入式操作系统
查看是否安装成功? 退出并重新进入控制台 对“arm-linux-”使用tab键,可以看到所有“arm-linux-”打头的工具 使用命令“arm-linux-gcc -v”查看编译器信息 2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
修改armboot include/configs/conifg_ep7312.h 2018/11/16 嵌入式操作系统
配置armboot的启动方式 2018/11/16 嵌入式操作系统
配置armboot,支持ep7312开发板 Build make ep7312_config sudo make all 2018/11/16 嵌入式操作系统
各种格式的 目标文件 2018/11/16 嵌入式操作系统
此外在根目录的tftpboot目录下也有一个armboot.bin备份 生成的目标文件有三个: armboot:ELF格式 armboot.bin:二进制映像文件格式 armboot.srec:Motolola的一种格式 此外在根目录的tftpboot目录下也有一个armboot.bin备份 2018/11/16 嵌入式操作系统
配置skyeye,并运行armboot 首先,新建一个目录代表ep7312的主板 将刚才编译成功的armboot.bin拷贝到这个目录下 mkdir ep7312forArmboot 将刚才编译成功的armboot.bin拷贝到这个目录下 skyeye支持raw binary和ELF格式,这里我们用raw binary的格式 编辑skyeye.conf skyeye.conf如下(下页) 此时,ep7312forArmboot主板就配置好了 2018/11/16 嵌入式操作系统
skyeye.conf #skyeye config file for armboot cpu: arm720t mach: ep7312 mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000 #skyeye for armboot flash 16M bank 1 mem_bank: map=M, type=RW, addr=0x00000000, size=0x01000000, file=./armboot.bin,boot=yes #skyeye for armboot sdram 16M bank 1 mem_bank: map=M, type=RW, addr=0xc0000000, size=0x01000000 log: logon=0, logfile=/tmp/c_2.log, start=0, end=10000 2018/11/16 嵌入式操作系统
进入ARMboot命令界面 2018/11/16 嵌入式操作系统
ARMboot的命令 2018/11/16 嵌入式操作系统
2018/11/16 嵌入式操作系统
blob Blob Boot Loader Object的缩写 是一款功能强大的Bootloader。 它遵循GPL,源代码完全开放。 Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是StrongARM SA-1100。 现在Blob已经被移植到了很多CPU上。 2018/11/16 嵌入式操作系统
LinuxBIOS 使用Linux启动Linux(或其他OS) LinuxBIOS目标是 以能在冷启动状态下启动Linux的Linux内核来替代PC、Alpha和其它机器上的常规BIOS。 LinuxBIOS根本上就是Linux 在通用的Linux内核打上大约10行的补丁。 再加上启动代码,大约500行的汇编和5000行的C代码,在Linux接管前运行16个指令来进入32位方式并完成DRAM和其它硬件的初始化。 2018/11/16 嵌入式操作系统
LinuxBIOS开放源代码,能迅速启动,是专为集群系统设计的BIOS,现在也用于消费类电子产品。 主页:The LinuxBIOS Project 2018/11/16 嵌入式操作系统
Review 嵌入式Linux的软件层次 Boot Loader 的概念 Boot Loader 的主要任务 Armboot、u-boot、Red Boot、blot等等 2018/11/16 嵌入式操作系统
Project 3:在skyeye中运行u-boot 安装交叉编译器 安装skyeye 编译u-boot 在skyeye中运行u-boot 提交实验报告 在实验报告中给出步骤 安装软件的版本 编译u-boot的命令 运行u-boot的界面 2018/11/16 嵌入式操作系统
Thanks! The end.