嵌入式Linux引导过程之1.2——Xloader的XLOADER_ENTRY

根据上文中获得的线索,本文分析init.S中的XLOADER_ENTRY。

在init.S中,定义了好多与平台相关的寄存器地址宏以及好多其他函数,我们在用到的时候再回过头来分析,这里,我们只看其中的一个函数(其实是一个标号,我们暂且称之为函数也无妨)——XLOADER_ENTRY。

好了,废话不多说,来贴代码:
 80 .global XLOADER_ENTRY
 81 XLOADER_ENTRY:
 82  
 83 /*;   IMPORT sys_init    */
 84    BL sys_init
 85 /*;   IMPORT ddr_init */
 86    BL ddr_init   
 87 /* ;   IMPORT Xloader_Entry   ; The C main routine has C_main label. */                   
 88
 89    LDR R14, =Xloader_Entry    /* ; Get the address of the C entry point. */
 90    MOV pc, R14

可以看到,这一段代码很简单,我们对其做一下简单的分析。

首先看到的是一个伪指令.global,对于这个伪指令的说明如下:
.global <symbol> 全局声明标志,这样声明的标号将可以被外部使用。(与armasm中的EXPORT相同)。
也就是相当于在C语言里面的非静态函数和非静态全局变量,可以被外部的函数调用,也就是说对全局可见。

在 这个整个程序的入口标号中,所做的事情很简单,无非就是对系统做了一些初始化(sys_init),对外部SDRAM初始化(ddr_init),然后就 跳转到了另一个函数(Xloader_Entry)去执行了,Xloader_Entry是在另一个C源文件中定义的,我们下次再来看。

由 于代码中直接使用了MOV pc, r14,因此当跳转出去之后,就再也不会回来了,因为不知道回来的路。聪明人在做任何事情之前都会为自己留好退路,就像BL sys_init和BL ddr_init那样,在走之前首先保存了返回地址。而MOV pc, r14直接为pc赋值并且没有额外手动保存返回地址,所以是没有办法回来的。
也正因为如此,当代码执行到这里的时候,XLOADER_ENTRY的使命也就完成了。

XLOADER_ENTRY很简单,它确实很简单。但不要得意的太早,想到我们的终极目标是成功引导Linux kernel,而现在,仅仅只是最初的第一步而已!

时间: 2024-11-05 16:28:49

嵌入式Linux引导过程之1.2——Xloader的XLOADER_ENTRY的相关文章

嵌入式Linux引导过程之1.6——Xloader的Xloader_Entry

我们已经看完了XLOADER_ENTRY里调用的前两个标号的代码,分别是sys_init和ddr_init.对于一个嵌入式系统来说,这两 个部分的代码是在一开始就执行的,至少是在从bootrom里面的firmware出来之后最初执行的代码,也是我们自己能够控制的最初的代码(在 bootrom里面的firmware是在芯片出厂的时候就固化在芯片里面的了,一般情况下,我们是无法改变里面的代码的). 正因为如 此,对于sys_init和ddr_init来说,需要做很多与系统底层硬件相关的初始化工作.而

嵌入式Linux引导过程之1.4——Xloader的ddr_init

这里我们来看XLOADER_ENTRY中调用的第二个标号ddr_init处的代码,这部分代码的作用是对外部内存SDRAM进行初始化,在我 spearplus开发板中,使用的是DDR SDRAM.在调用ddr_init之前,外部内存是不能用的,因为外部内存的时钟以及控制寄存器都还没有初始化,因此此时只有芯片内部的SRAM以及在 sys_init的时候已经初始化了的Serial Flash.UART以及gmac是可用的. 而ddr_init的作用就是根据板子 使用的外部SDRAM来对外部内存进行初始

嵌入式Linux引导过程之1.3——Xloader的sys_init

上一篇文章对XLOADER_ENTRY进行了分析,看到其中调用的第一个标号就是sys_init,本文就对这个标号对应的代码段进行粗略的分析,这里我也还有好多没有搞明白的,就先留着,日后慢慢明白,先把自己目前能够看明白的东西记下来. 另外,需要说明的是,像sys_init以及后续还要讲的ddr_init之类的代码是与体系结构高度相关的,由于我的文章针对的是SPEArPlus开发板的,因此,上面提到的所有寄存器的地址以及功能说明要需要参考相应的user manual文档. 与本文代码对应的文档是SP

嵌入式Linux引导过程之1.1——Xloader的xloader.lds

本文中的所有代码版本都是基于ST的SpearPlus开发板的. xloader是在系统上电之后,执行完ROM中的frimware后最先开始执行的用户程序,它的体积很小,执行的功能也很简单,主要是对系统时 钟以及外部SDRAM进行初始化,初始化完成之后就检查Flash中的uboot image是否准备好,如果准备好了就将Flash中的uboot image根据image header中指定的load address加载到外部SDRAM中,然后就跳转到uboot执行代码. 这里,我试图从头开始,在源

使用 Yocto Project 构建自定义嵌入式 Linux 发行版

概述 Yocto Project 是一个开源协作项目,它提供了一些模板.工具和方法来支持面向嵌入 式产品的自定义 Linux 系统,不管硬件架构是什么.我想要告诉那些对 yocto 这个名称不甚理解的用 户的是,术语 yocto 是最小的 SI 单元.最为一个前缀,yocto 表示 10^-24. 本文将提供一个 分步指导,向您介绍如何使用 Yocto Project 的行业标准开源工具为嵌入式设备创建自定义的 Linux 操作系统,并使用 QEMU 在一台虚拟机中启动操作系统.Yocto Pr

基于ARM的嵌入式linux系统设计

基于ARM的嵌入式linux系统设计 摘要:本文简要介绍了ARM处理器的特点及其基本结构,详细论述了基于ARM的嵌入式linux系统的关键技术,包括引导加载程序.Linux内核.文件系统.用户应用程序.对linux系统的各部分开发设计做了较深入清晰地分析,总结了linux系统的特点,及其在嵌入式操作系统竞争中的优势.   关键字:ARM   linux  引导加载程序 内核 文件系统       Design of the embedded linux system based ARM     

Yocto Project用于嵌入式Linux开发的专业级开源工具

Yocto Project 是一个开源协作项目,它提供了一些模板.工具和方法来支持面向嵌入式产品的自定义 Linux 系统,不管硬件架构是什么.我想要告诉那些对 yocto 这个名称不甚理解的用户的是,术语 yocto 是最小的 SI 单元.最为一个前缀,yocto 表示 10^-24. 本文将提供一个分步指导,向您介绍如何使用 Yocto Project 的行业标准开源工具为嵌入式设备创建自定义的 Linux 操作系统,并使用 QEMU 在一台虚拟机中启动操作系统.Yocto Project

《嵌入式Linux基础教程(第2版)》——2.2 剖析嵌入式系统

2.2 剖析嵌入式系统 图2-1是一个典型嵌入式系统的框图.这个例子很简单,描述了一个系统的高层硬件架构,无线接入点设备可能就是采用这种硬件构架.这个系统架构以一个32位的RISC处理器为中心,系统中的闪存用于存储非易失性程序和数据,主存储器是SDRAM(同步动态随机存储器),其容量可以从几兆至几百兆字节,视应用而定.一个通常由电池供电的实时时钟模块记录着当前时间(包括日期).这个例子里面包含以太网和USB接口,也包含串行端口,利用串行端口可基于RS-232标准访问控制台.802.11芯片组或模

《嵌入式Linux基础教程(第2版)》——2.3 存储

2.3 存储 嵌入式Linux开发的一大挑战性源自大多数嵌入式系统的物理资源非常有限.虽然你的台式电脑会拥有酷睿2双核处理器和500 GB大小的硬盘,但很难找到拥有如此巨大硬盘容量的嵌入式系统.多数情况下,硬盘通常被更小和更便宜的非易失性存储设备所取代.硬盘不仅笨重,包含旋转部件,对物理震动敏感,并且要求提供多种供电电压,因此并不适合用在许多嵌入式系统中. 2.3.1 闪存 几乎所有人都对消费电子设备,比如数码相机和PDA(这两者都是很好的嵌入式系统的例子)中广泛使用的Compact Flash