linux课程设计之bootloader的移植

上传人:xins****2008 文档编号:111225227 上传时间:2019-11-02 格式:DOC 页数:29 大小:228KB
返回 下载 相关 举报
linux课程设计之bootloader的移植_第1页
第1页 / 共29页
linux课程设计之bootloader的移植_第2页
第2页 / 共29页
linux课程设计之bootloader的移植_第3页
第3页 / 共29页
linux课程设计之bootloader的移植_第4页
第4页 / 共29页
linux课程设计之bootloader的移植_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《linux课程设计之bootloader的移植》由会员分享,可在线阅读,更多相关《linux课程设计之bootloader的移植(29页珍藏版)》请在金锄头文库上搜索。

1、嵌入式Linux课程设计报告课题:嵌入式Linux下的bootloader之u-boot的移植姓名: 胡欢 专业班级: 电信三班学号:080102031122指导老师: 刘小洋 时间: 2011-10-12一 概述:(1 ) BootLoader是什么?系统上电之后,需要一段程序来进行初始化:关闭WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等。如果它能将操作系统内核复制到内存中运行,无论从本地,比如Flash;还是从远端,比如网络,就称这段程序为Bootloader。简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们

2、可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。Bootloader 是可以添加功能的,比如网络功能。通过串口或网络从PC下载烧写文件、将存储在Flash 上压缩的文件解压后再运行等,这样的Bootloader是比较强大的,也称为Monitor。实际上,在最终产品中用户并不需要使用这些功能,它们只是为了方便开发。Bootloader 的实现非常依赖于具体硬件,在嵌入式系统中硬件配置千差万别,即使是相同的

3、CPU,它的外设也可能不同,比如Flash不同,所以不可能有一个Bootloader 支持所有的CPU、所有的电路板。即使是支持CPU 架构比较多的U-Boot,也不是一拿来就可以使用的,需要进行一些移植。(2) 为什么需要BootLoader?引导加载程序是系统加电后运行的第一段软件代码。PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的 RAM中,然后将控制权交给OS BootLoader。BootLoader的主要

4、运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。 简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬

5、件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。二:系统总体设计和模块结构知识:(一) 嵌入式Linux软件结构与分布 在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。而S3C24x0则很简单,只有Norboot和Nandboot。(2)Linux kernel 和drivers。

6、(3)文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。(4)应用程序。用户自定义的应用程序,存放于文件系统之中。在Flash 存储器中,他们的 一般分布如下:(二)U-Boot主要目录结构- board 目标板相关文件,主要包含SDRAM、FLASH驱动;- common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;- cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;- driver 通用设备驱动,如CF

7、I FLASH驱动(目前对INTEL FLASH支持较好)- doc U-Boot的说明文档;- examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;- include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;- lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;- net 与网络功能相关的文件目录,如bootp,nfs,tftp;- post 上电自检文件目录。尚有待于进一步完善;- rtc RTC驱动程序;-

8、tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;(三)U-Boot启动过程:Stage1工作流程:Stage1的代码都是与平台相关的,使用汇编语言编写占用空间小而且执行速度快。以ARM920为例,Stage1阶段主要是设置各模式程序异常向量表,初始化处理器相关的关键寄存器以及系统内存。Stage1负责建立Stage1阶段使用的堆栈和代码段,然后复制Stage2阶段的代码到内存。Stage2工作流程:Stage2阶段一般包括:初始化Flash器件、检测系统内存映射、初始化网络设备、进入命令循环,接收用户从串口发送的命令然后进行相应的处理。Stage2使用C语言编写,用于

9、加载操作系统内核,该阶段主要是board.c中的start_armboot()函数实现。 三 原理介绍与系统实现:(一)工作原理及代码分析:1 第一阶段(Stage 1) 中断向量表的设置 .globl _start _start:b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq _undefined_instruction: .word

10、 undefined_instruction _software_interrupt: .word software_interrupt _prefetch_abort: .word prefetch_abort _data_abort: .word data_abort _not_used: .word not_used _irq: .word irq _fiq: .word fiq .balignl 16,0xdeadbeef Start.s 文件一开始,就定义了_start 的全局变量。也即,在别的文件,照 样能引用这个_start 变量。这段代码验证了我们之前学过的 arm 体系的理论

11、知 识:中断向量表放在从 0x0 开始的地方。其中,每个异常中断的摆放次序,是 事先规定的。比如第一个必须是 reset 异常,第二个必须是未定义的指令异常等等。需要注意的是,在这里,我们也可以理解:为何系统一上电,会自动运行代码。因为系统上电后,会从 0x0 地方取指令,而 0x0 处放置的是 reset 标签,直接就跳去 reset 标签处去启动系统了。另外,这里使用了 ldr 指令。而 ldr 指令中的 label,分别用一个.word伪操 作来定义。比如: _undefined_instruction: .word undefined_instruction 我们用 source in

12、sight 跟踪代码后,发现,undefined_instruction 在 start.s 的后面给出了具体的操作,如下: undefined_instruction: get_bad_stack bad_save_user_regs bl do_undefined_instruction 在跳转到中断服务子程序之前,先有两个宏代码,一个是对stack的操作, 一个是用户regs的保存。然后才能跳转如中断服务子程序中执行。读者若不理 解进入中断之前做的“现场保护”,请参考ARM体系结构与编程等相关书籍, 自然能获得详细的答案。 值得一提的是,当发生异常时,都将执行 u-boot-1.2.0c

13、puarm920t interrupts.c 中定义的中断函数。也就是说,start.s 中要跳转的这些中断子程 序的代码,均在 u-boot-1.2.0cpuarm920t interrupts.c 中定义。 U-Boot存储器映射定义 该代码段主要是定义u-boot 需要使用的一些映射区的label,比如用户堆区、用户栈区、全局数据结构区等。_TEXT_BASE: .word TEXT_BASE .globl _armboot_start _armboot_start: .word _start * These are defined in the board-specific linke

14、r script. */ .globl _bss_start _bss_start: .word _bss_start .globl _bss_end _bss_end: .word _end #ifdef CONFIG_USE_IRQ /* IRQ stack memory (calculated at run-time) */ .globl IRQ_STACK_START IRQ_STACK_START: .word 0x0badc0de /* IRQ stack memory (calculated at run-time) */ .globl FIQ_STACK_START FIQ_STACK_START: .word 0x0badc0de #endif 从上图也可以清晰地发现,堆和栈是有区别的。而且可以看到,用户栈区是 向下递减的,即地址减少的方向生长。 上电后CPU为SVC模式 reset: /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 这是系统复位后执行的“第一个代码段”(严格来说不是)。CPU 复位后,系 统会立即被设置成 SVC 模式。记得之前有网

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号