第五讲 TI嵌入式处理器的启动及uBOOT分析
嵌入式启动流程 汇编代码解析

嵌入式启动流程:汇编代码解析1.加载引导程序嵌入式系统在加电后,第一个执行的程序通常是引导程序(Bootloader)。
它负责从存储设备中加载并执行后续的程序。
引导程序通常在启动时进行硬件设备的自检,然后从特定的存储位置(如闪存或RAM)加载后续程序。
引导程序通常使用汇编语言编写,因为它需要在硬件级别进行操作。
它负责初始化CPU、内存、硬盘等硬件设备,并确保系统环境满足后续程序的要求。
2.初始化硬件设备在引导程序之后,接下来的任务是初始化硬件设备。
这包括初始化CPU、内存、硬盘、显示器等设备。
初始化硬件设备的过程包括设置设备的寄存器、配置设备的接口等。
在这个过程中,硬件设备被配置为适合后续程序运行的状态。
3.设置内存管理器在硬件设备初始化完成后,接下来需要设置内存管理器。
内存管理器负责管理系统的内存资源,包括内存的分配、释放和保护。
内存管理器通常由操作系统内核提供,因此在加载操作系统内核之前,需要先初始化内存管理器。
4.加载操作系统内核在内存管理器初始化完成后,可以加载操作系统内核。
操作系统内核是系统的核心部分,负责管理系统资源、调度应用程序的运行等。
操作系统内核通常被压缩并保存在存储设备中,因此需要先解压缩并加载到内存中。
然后,内核会进行自身的初始化,包括设置系统时钟、配置设备驱动等。
5.启动内核并初始化系统服务在操作系统内核加载并初始化完成后,可以启动内核并初始化系统服务。
系统服务是指为应用程序提供支持的底层服务,如文件系统、网络服务等。
启动内核后,会执行一系列的系统初始化过程,包括设置系统环境变量、加载系统服务等。
这些过程完成后,系统就可以接受应用程序的请求并为其提供服务。
6.加载文件系统和应用程序在系统服务初始化完成后,可以加载文件系统和应用程序。
文件系统是存储和管理文件数据的系统,应用程序则是为用户提供服务的程序。
文件系统通常被加载到内存中,并初始化为可用的状态。
然后,可以按需加载应用程序到内存中并执行。
嵌入式linux系统的启动流程

嵌入式linux系统的启动流程
嵌入式Linux系统的启动流程一般包括以下几个步骤:
1.硬件初始化:首先会对硬件进行初始化,例如设置时钟、中
断控制等。
这一步骤通常是由硬件自身进行初始化,也受到系统的BIOS或Bootloader的控制。
2.Bootloader引导:接下来,系统会从存储介质(如闪存、SD
卡等)的Bootloader区域读取引导程序。
Bootloader是一段程序,可以从存储介质中加载内核镜像和根文件系统,它负责进行硬件初始化、进行引导选项的选择,以及加载内核到内存中。
3.Linux内核加载:Bootloader会将内核镜像从存储介质中加载到系统内存中。
内核镜像是包含操作系统核心的一个二进制文件,它由开发者编译并与设备硬件特定的驱动程序进行连接。
4.内核初始化:一旦内核被加载到内存中,系统会进入内核初
始化阶段。
在这个阶段,内核会初始化设备驱动程序、文件系统、网络协议栈等系统核心。
5.启动用户空间:在内核初始化完毕后,系统将启动第一个用
户空间进程(init进程)。
init进程会读取并解析配置文件(如
/etc/inittab)来决定如何启动其他系统服务和应用程序。
6.启动其他系统服务和应用程序:在用户空间启动后,init进
程会根据配置文件启动其他系统服务和应用程序。
这些服务和应用程序通常运行在用户空间,提供各种功能和服务。
以上是嵌入式Linux系统的基本启动流程,不同的嵌入式系统可能会有一些差异。
同时,一些特定的系统也可以添加其他的启动流程步骤,如初始化设备树、加载设备固件文件等。
《嵌入式ARM教案》课件

《嵌入式ARM教案》PPT课件第一章:嵌入式系统概述1.1 嵌入式系统的定义介绍嵌入式系统的概念、特点和应用领域强调嵌入式系统与传统计算机系统的区别1.2 嵌入式系统的发展回顾嵌入式系统的发展历程探讨未来嵌入式系统的发展趋势1.3 嵌入式系统的组成部分介绍嵌入式系统的硬件和软件组成解释嵌入式系统中的核心部件:中央处理器(CPU)第二章:ARM处理器简介2.1 ARM处理器的发展历程介绍ARM公司的成立和发展历程讲解ARM处理器的命名规则和版本更新2.2 ARM处理器的特点阐述ARM处理器的架构和指令集特点强调ARM处理器的功耗、性能和成本优势2.3 ARM处理器的应用领域分析ARM处理器在不同领域的应用案例展望ARM处理器在未来的应用前景第三章:ARM指令集和编程3.1 ARM指令集概述介绍ARM指令集的分类和特点讲解ARM指令的格式和操作码3.2 ARM指令的执行过程分析ARM指令的取指、译码、执行和写回过程解释ARM指令的流水线结构和流水线优化3.3 ARM编程实例介绍ARM编程的基本方法和技巧提供简单的ARM编程实例,让学员了解编程过程第四章:嵌入式系统设计和开发流程4.1 嵌入式系统设计原则讲解嵌入式系统设计的关键原则强调嵌入式系统设计的灵活性和可扩展性4.2 嵌入式系统开发流程介绍嵌入式系统开发的各个阶段阐述各阶段的主要任务和注意事项4.3 嵌入式系统开发工具和环境讲解常用的嵌入式系统开发工具和软件介绍嵌入式系统开发环境搭建的步骤和方法第五章:嵌入式系统硬件设计5.1 嵌入式系统硬件设计概述介绍嵌入式系统硬件设计的基本要求强调嵌入式系统硬件设计的可靠性和稳定性5.2 嵌入式系统硬件模块设计讲解嵌入式系统中的主要硬件模块分析各个模块的功能和相互之间的关系5.3 嵌入式系统硬件设计实例提供嵌入式系统硬件设计实例让学员了解硬件设计过程和注意事项第六章:嵌入式系统软件开发6.1 嵌入式操作系统概述介绍嵌入式操作系统的概念和分类强调嵌入式操作系统在嵌入式系统中的重要性6.2 嵌入式操作系统原理讲解嵌入式操作系统的核心组件和工作原理解释嵌入式操作系统的任务调度和资源管理6.3 嵌入式软件开发介绍嵌入式软件开发的基本方法和技巧提供嵌入式软件开发实例,让学员了解开发过程第七章:嵌入式系统应用案例分析7.1 嵌入式系统在工业控制中的应用分析嵌入式系统在工业控制领域的应用案例强调嵌入式系统在提高工业生产效率方面的作用7.2 嵌入式系统在消费电子中的应用讲解嵌入式系统在消费电子领域的应用案例探讨嵌入式系统在智能家居、可穿戴设备等领域的应用前景7.3 嵌入式系统在其他领域的应用介绍嵌入式系统在医疗、交通、教育等领域的应用案例展望嵌入式系统在未来各个领域的发展趋势第八章:嵌入式系统安全与防护8.1 嵌入式系统安全概述讲解嵌入式系统安全的重要性介绍嵌入式系统面临的安全威胁和攻击手段8.2 嵌入式系统安全防护策略阐述嵌入式系统安全防护的技术和方法强调安全防护策略在提高嵌入式系统安全性方面的作用8.3 嵌入式系统安全案例分析分析典型的嵌入式系统安全案例让学员了解嵌入式系统安全防护的实践应用第九章:嵌入式系统发展趋势与挑战9.1 嵌入式系统技术发展趋势分析嵌入式系统技术的发展趋势强调创新技术和新兴领域对嵌入式系统的影响9.2 嵌入式系统面临的挑战讲解嵌入式系统在发展过程中面临的挑战探讨应对挑战的方法和策略9.3 我国嵌入式系统发展现状与展望介绍我国嵌入式系统发展的现状展望我国嵌入式系统未来的发展前景第十章:总结与展望10.1 课程回顾总结本课程的主要内容和知识点强调嵌入式ARM教案在实际应用中的重要性10.2 实践与思考鼓励学员在实际工作中运用嵌入式ARM教案的知识提出针对性的思考题,引导学员深入思考和探索10.3 未来展望展望嵌入式系统领域的未来发展趋势强调继续学习和不断提升自身能力的重要性重点解析本文教案主要围绕嵌入式ARM系统进行讲解,涵盖了嵌入式系统的概述、ARM 处理器简介、ARM指令集和编程、嵌入式系统设计和开发流程、嵌入式系统硬件设计、嵌入式系统软件开发、嵌入式系统应用案例分析、嵌入式系统安全与防护、嵌入式系统发展趋势与挑战以及课程总结与展望等内容。
U-BOOT启动过程

U-Boot启动过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能Ø硬件设备初始化Ø加载U-Boot第二阶段代码到RAM空间Ø设臵好栈Ø跳转到第二阶段代码入口(2)第二阶段的功能Ø初始化本阶段使用的硬件设备Ø检测系统内存映射Ø将内核从Flash读取到RAM中Ø为内核设臵启动参数Ø调用内核1.1.1U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/start.S和board/samsung/mini2440/lowlevel_init.S。
U-Boot启动第一阶段流程如下:图 2.1 U-Boot启动第一阶段流程根据cpu/arm920t/u-boot.lds中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/start.o (.text)board/samsung/mini2440/lowlevel_init.o (.text)board/samsung/mini2440/nand_read.o (.text)*(.text)}……}第一个链接的是cpu/arm920t/start.o,因此u-boot.bin的入口代码在cpu/arm920t/start.o中,其源代码在cpu/arm920t/start.S中。
下面我们来分析cpu/arm920t/start.S的执行。
1.硬件设备初始化(1)设臵异常向量cpu/arm920t/start.S开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /* 未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量*/ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 *//* 中断向量表入口地址 */_undefined_instruction: .word 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以上代码设臵了ARM异常向量表,各个异常向量介绍如下:表 2.1 ARM异常向量表在cpu/arm920t/start.S中还有这些异常对应的异常处理程序。
arm cortex 的启动流程

arm cortex 的启动流程ARM Cortex是一种高性能的处理器架构,广泛应用于各种嵌入式系统中。
在使用ARM Cortex处理器时,启动流程是非常重要的一步,它决定了系统的稳定性和可靠性。
下面我们来详细了解一下ARM Cortex的启动流程。
ARM Cortex处理器的启动流程可以分为两个阶段:复位阶段和启动阶段。
在复位阶段,处理器会执行一系列的初始化操作,包括清除寄存器、初始化时钟、设置中断向量表等。
在启动阶段,处理器会加载操作系统或应用程序,并开始执行。
在复位阶段,处理器会首先执行复位向量,这是一个特殊的地址,指向处理器的复位程序。
复位程序会执行一系列的初始化操作,包括清除寄存器、初始化时钟、设置中断向量表等。
其中,中断向量表是一个非常重要的数据结构,它包含了所有中断的入口地址。
在初始化时,处理器会将中断向量表加载到内存中,并设置中断向量表的地址。
在启动阶段,处理器会加载操作系统或应用程序,并开始执行。
在ARM Cortex处理器中,启动代码通常是由Bootloader程序完成的。
Bootloader程序是一个小型的程序,它负责加载操作系统或应用程序,并将控制权转交给它们。
在启动过程中,Bootloader程序会执行一系列的初始化操作,包括初始化内存、初始化外设等。
然后,它会加载操作系统或应用程序,并将控制权转交给它们。
在ARM Cortex处理器中,启动代码通常是由汇编语言编写的。
汇编语言是一种低级语言,它可以直接操作处理器的寄存器和内存。
在编写启动代码时,需要非常小心,确保代码的正确性和可靠性。
同时,还需要考虑处理器的架构和特性,以便充分发挥处理器的性能和功能。
ARM Cortex处理器的启动流程是非常重要的一步,它决定了系统的稳定性和可靠性。
在编写启动代码时,需要非常小心,确保代码的正确性和可靠性。
同时,还需要考虑处理器的架构和特性,以便充分发挥处理器的性能和功能。
UBOOT源码分析

UBOOT源码分析UBOOT是一种开放源码的引导加载程序。
作为嵌入式系统启动的第一阶段,它负责初始化硬件设备、设置系统环境变量、加载内核镜像以及跳转到内核开始执行。
Uboot的源码是开放的,让我们可以深入了解其内部工作机制和自定义一些功能。
Uboot源码的文件组织结构非常清晰,主要分为三个大类:目录、文件和配置。
其中目录包含了一系列相关的文件,文件存放具体的源码实现代码,配置文件包含了针对特定硬件平台的配置选项。
Uboot源码的核心部分是启动代码,位于arch目录下的CPU架构相关目录中。
不同的CPU架构拥有不同的启动代码实现,如arm、x86等。
这些启动代码主要包括以下几个关键功能:1. 初始化硬件设备:Uboot首先需要初始化硬件设备,例如设置时钟、中断控制器、串口等设备。
这些初始化操作是在启动代码中完成的。
通过查看该部分代码,我们可以了解硬件的初始化过程,以及如何配置相关寄存器。
2. 设置启动参数:Uboot启动参数存储在一个称为"bd_info"的数据结构中,它包含了一些关键的设备和内存信息,例如DRAM大小、Flash 大小等。
这些参数是在启动代码中设置的,以便内核启动时能够正确识别硬件情况。
3. 加载内核镜像:Uboot负责加载内核镜像到内存中,以便内核可以正确执行。
在启动代码中,会通过读取Flash设备或者网络等方式,将内核镜像加载到指定的内存地址处。
加载过程中,可能会进行一些校验和修正操作,以确保内核数据的完整性。
4. 启动内核:在内核镜像加载完成后,Uboot会设置一些寄存器的值,并执行一个汇编指令,跳转到内核开始执行。
此时,Uboot的使命即结束,控制权交由内核处理。
除了启动代码,Uboot源码中还包含了许多其他功能模块,如命令行解析器、存储设备驱动、网络协议栈等。
这些功能模块可以根据需求进行配置和编译,以满足不同平台的需求。
例如,可以通过配置文件选择启用一些功能模块,或者自定义一些新的功能。
arm版本linux系统的启动流程

arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
U-BOOT介绍以及常用U-bot命令介绍

U-BOOT介绍以及常用U-bot命令介绍一. BootLoader简介在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:1、引导加载程序。
包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、 Linux内核。
特定于嵌入式板子的定制内核以及内核的启动参数。
3、文件系统。
包括根文件系统和建立于Flash内存设备之上文件系统。
通常用ramdisk来作为rootfs。
4、用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式GUI有:MicroWindows和MiniGUI懂。
引导加载程序是系统加电后运行的第一段软件代码。
PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。
BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。
BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012/11/16
美国德州仪器
15
基于Beagle Board嵌入式处理器的系统开发
4、头文件
头文件位于源码树下的include中,其中各种主板的配置文 件位于include/configs文件夹中,比如omap730主板的配置 文件为include/configs/omap730.h。 目录include/asm-***是一些比较底层的头文件,编译时会 根据不同的配置与include/configs/asm建立一个符号链接。
UBL函数入口点是flash_utils目录下的 Common/arch/arm926ejs/start.S。 程序首先设置了堆栈 指针寄存器,然后将 main_entry地址赋值给 r0寄存器,也就是 main的入口点赋值给 r0寄存器,然后将pc 指针指向main入口点, 程序跳到main函数执 行。
9
基于Beagle Board嵌入式处理器的系统开发
二、U-Boot源码框架内容分析
uBoot源码各个目录和代码结构。 uBoot的启动过程分析。 uBoot如何实现自定义的命令。 uBoot如何将参数传递给内核进行解析。
2012/11/16
美国德州仪器
10
基于Beagle Board嵌入式处理器的系统开发
第二类命令是“有去无回”的命令,类似于bootm 0x8000000或者go 0x8000000,这类指令最终将去启动 内核,以此系统将不再返回。
2012/11/16
美国德州仪器
25
基于Beagle Board嵌入式处理器的系统开发
网络传输代码位于目录net下面,arp.c,bootp.c,eth.c, tftp.c等都在这里,BOOTP,TFTP,以太网初始化等功能的实 现也是由这些代码完成的。
2012/11/16 美国德州仪器 22
基于Beagle Board嵌入式处理器的系统开发
在该无限循环中,首先调用readline(CFG_PROMPT)从终端获取相应 的命令。然后判断命令长度,若终端输入的仅仅是一个回车的操作符时, u-boot将把其解释成重复上次操作的命令,因此置位相应的flag位 “flag|=CMD_FLAG_REPEAT;”
3、与CPU相关的代码
cpu相关的代码位于cpu目录下,在该目录下,列出 了当前版本的u-boot所能支持的所有cpu类型。和目 标板相关的代码类似,该目录的每个子目录都对应 一种具体的cpu类型。
2012/11/16
美国德州仪器
13
基于Beagle Board嵌入式处理器的系统开发
uboot所支持的cpu类型
2012/11/16 美国德州仪器 6
基于Beagle Board嵌入式处理器的系统开发
根据不同的boot模式,执行将uboot镜像从不同存储设备拷 贝到内存的操作,此处通过NANDBOOT_copy来简单分析。
2012/11/16
美国德州仪器
7
基于Beagle Board嵌入式处理器的系统开发
2012/11/16 美国德州仪器 24
基于Beagle Board嵌入式处理器的系统开发
调用run_command()去解析执行相应的命令。对于 U-Boot而言总共有两类命令,一类命令执行后能够返 回的,对于此类命令,该处还将判断返回值,若返回 值不对,证明这是一条无效的命令,把全局变量 lastcommand置为空,因此下次若想再以回车来执行无 效命令时,就不会再去执行一遍无效命令
NANDBOOT_copy函数最后将uboot的入口点赋值给 gEntryPoint,该变量是在main函数上定义的全局变量,该 变量在main函数最后当做一个函数指针来执行,也就是跳 转到DDR的uboot起始地址处执行,至此,UBL工作完毕, 控制权交给了uboot。
2012/11/16
美国德州仪器
基于Beagle Board嵌入式处理器的系统开发
TI嵌入式处理器的启动以及 uBOOT分析
2012/11/16
美国德州仪器
1
基于Beagle Board嵌入式处理器的系统开发
一、UBL源码结构分析
二
2012/11/16
美国德州仪器
2012/11/16
美国德州仪器
5
基于Beagle Board嵌入式处理器的系统开发
LOCAL_boot中,首先判断板子启动模式,也就是板子上 的拨码开关的设置,DEVICE_bootMode通过读取SYSTEM 控制寄存器来获取拨码开关的信息。 执行DEVICE_init执行板级初始化,包括电源、时钟、 DDR、EMIF、UART、I2C、TIMER等。
环境变量文件:包括environment.c和所有以env_打头的文件, 其中environment.c是环境变量相关的入口文件。 C函数入口文件main.c:当cpu和板级初始化后,将调用 main_loop()进入一个无限循环,等待界面发出命令或者直 接执行虚设的某些命令 命令解析文件:命令解析文件包含command.c和所有以cmd_ 打头的文件,其中command.c是所有以cmd_打头的命令文 件的入口文件。
2012/11/16
美国德州仪器
26
基于Beagle Board嵌入式处理器的系统开发
三、U-Boot 启动流程简要分析
U-Boot 启动内核的过程可以分为两个阶段,两个阶段功能如下:
第一阶段的功能 Ø 硬件设备初始化 Ø 加载U-Boot第二阶段代码到RAM空间 Ø 设置栈 Ø 跳转到第二阶段代码入口 第二阶段的功能 Ø 初始化本阶段使用的硬件设备 Ø 检测系统内存映射 Ø 将内核从Flash读取到RAM中 Ø 为内核设置启动参数 Ø 调用内核 下面我们以DM365为例对启动过程进行说明:
2012/11/16 美国德州仪器 14
基于Beagle Board嵌入式处理器的系统开发
由上图可以看出,该U-boot版本已经支持多种系 列的cpu,可以看出u-boot是一种被广泛使用的 bootloader。 在具体cpu对应的目录中,一般包含以下文件: Config.mk,该文件主要包含一些编译选项,该 文件将被相同目录下的Makefile所引用。 Makefie,程序编译规则。 Start.S,启动代码,真正U-Boot映像的入口点。 其它一些cpu初始化代码。
2012/11/16
美国德州仪器
18
基于Beagle Board嵌入式处理器的系统开发
5、公共代码
该目录下的代码构成了uboot的基本框架,也是u-boot的精 髓所在,因为板级相关的代码和cpu相关的代码往往都是 由cpu厂商按u-boot的规则提供的,目的是推广目标板或芯 片,但这些公共的代码则是由Denx项目组成员开发和维护 的。其目的是提供一套不同目标板的共性,比如在引导时 与目标板的信息交互、环境变量的设置等,这样就可以省 去具体BSP包开发人员很多的工作量。而且U-Boot中这些 公共文件做的非常完善,应该能够满足大部分嵌入式系统 开发的要求,比如支持各式各样的命令,这些都是u-boot 非常突出的优点。
1、Uboot目录结构图:
• • • • • • • • • • • • • 与目标板相关的代码,对应board目录。 公共代码,对应于common目录。 与cpu相关的代码,对应于cpu目录。 磁盘驱动和磁盘分区相关的处理代码,对 应于disk目录。 说明文档,对应于doc目录。 关键的驱动程序,对应于drivers目录。 简单的应用历程,对应于example目录。 头文件,对应于include目录。 体系结构相关的代码,对应于lib_arm等目 录。 体系结构无关的代码,对应于lib_generic目 录。 网络传输代码,对应于net目录。 上电自检代码对应于post目录。 U-Boot常用工具,对应于tools目录。
2012/11/16
美国德州仪器
21
基于Beagle Board嵌入式处理器的系统开发
首先获取环境变量中有关bootdelay的定义。此参数说明了启动时预留的人工干预 时间,若在指定的时间内无人干预,那么U-Boot将执行默认的启动命令序列,即执 行环境变量中“bootcmd”中相关的设置。当然,若“bootcmd”没有定义时,系统 将打印提示符界面,等待用户输入具体的指令去干预系统的行为。 通过调用getenv(“bootcmd”)获取环境变量中“bootcmd”相关的设置,然后调用 run_command()去执行相应的启动命令序列。
2012/11/16 美国德州仪器 23
基于Beagle Board嵌入式处理器的系统开发
但并未改变全局变量lastcommand。当命令的长度不为0时,意味着用 户确实输入了相应的命令,因此将调用strcpy(lastcommad, console_buffer)把全局变量置位为当前的命令,以此实现了命令的更替。
2012/11/16
美国德州仪器
11
基于Beagle Board嵌入式处理器的系统开发
2、与目标板相关的代码
在U-Boot中,目标板相关的代码都位于board目录,在该目录下,列 出了当前版本的U-Boot所能支持的所有目标板。目前U-Boot支持大 多数比较常见的目标板,如Motorola的FADS板,TI的Omap系列等。 源码树中board目录下的每个文件夹对应一个目标板,比如 board/fads,board/omap730p2。在该版本(1.3.4)中共有250个文件夹, 说明支持250种常用的目标板。 在每个目标板对应的目录中,一般至少包含以下文件:
NANDBOOT_copy函数首先执行NAND初始化,然后从 Nand中读取页面信息,查找uboot开始位置,由magicNum 的检测可以看出,确定uboot的位置是通过maginNum来进 行的,最后将uboot拷贝到DDR中。