嵌入式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,而现在,仅仅只是最初的第一步而已!
嵌入式Linux引导过程之1.2——Xloader的XLOADER_ENTRY的更多相关文章
- 嵌入式Linux引导过程之1.6——Xloader的Xloader_Entry
我们已经看完了XLOADER_ENTRY里调用的前两个标号的代码,分别是sys_init和ddr_init.对于一个嵌入式系统来说,这两 个部分的代码是在一开始就执行的,至少是在从bootrom里面的 ...
- 嵌入式Linux引导过程之1.4——Xloader的ddr_init
这里我们来看XLOADER_ENTRY中调用的第二个标号ddr_init处的代码,这部分代码的作用是对外部内存SDRAM进行初始化,在我 spearplus开发板中,使用的是DDR SDRAM.在调用 ...
- 嵌入式Linux引导过程之1.3——Xloader的sys_init
上一篇文章对XLOADER_ENTRY进行了分析,看到其中调用的第一个标号就是sys_init,本文就对这个标号对应的代码段进行粗略的分析,这里我也还有好多没有搞明白的,就先留着,日后慢慢明白,先把自 ...
- 嵌入式Linux引导过程之1.1——Xloader的xloader.lds
本文中的所有代码版本都是基于ST的SpearPlus开发板的. xloader是在系统上电之后,执行完ROM中的frimware后最先开始执行的用户程序,它的体积很小,执行的功能也很简单,主要是对系统 ...
- 嵌入式Linux引导过程之1.5——从BootRom到Xloader
在开始看Xloader_Entry的代码之前,我想先总结一下从芯片上电到开始运行Xloader的代码的过程,这是我目前理解的一个过程,可能有所出入,待以后继续完善. 当 系统上电之后,首先会将PC寄存 ...
- 嵌入式linux加载引导内核和根文件系统的方法
总体来说,嵌入式Linux内核和根文件的引导与PC机差不多.嵌入式linux内核和根文件系统可以存放在各种可能的存储设备中,一般情况下我 们将内核和根文件系统直接烧入到Flash中(包括NOR和NAN ...
- linux引导流程
本章重点: 1.linux引导流程 2.linux运行级别 3.linux启动服务管理 4.GRUB配置与应用 5.启动故障分析解决 linux启动流程 1.固件(fireware):固话在硬件上的程 ...
- 嵌入式Linux内核制作【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51291316 1. Linux体系结构 从整体上来分,linux可以分为User ...
- 《嵌入式Linux基础教程学习笔记一》
常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...
随机推荐
- 八大排序算法Java实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
- spring之AspectJ基于注解 AOP编程
一.前言 使用注解代替之前在spring配置文件中配置目标类.切面类和aop配置. 二.注意 需要注意的是,需要在spring配置文件中引入如下,如果不添加,切面类中的@Aspect注解将不起作用 & ...
- JAVA并发编程学习笔记------锁顺序死锁
一.需求描述: 将资金从一个账户转移到另一个账户. 二.程序实现: (1)账户类: public class Account { private long account; public Accoun ...
- Object Detection · RCNN论文解读
转载请注明作者:梦里茶 Object Detection,顾名思义就是从图像中检测出目标对象,具体而言是找到对象的位置,常见的数据集是PASCAL VOC系列.2010年-2012年,Object D ...
- Sonar项目主要指标以及代码坏味道详解
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...
- 看图说话,P2P 分享率 90% 以上的 P2P-CDN 服务,来了!
事情是这样的:今年年初的时候,公司准备筹划一个直播项目,在原有的 APP 中嵌入直播模块,其中的一个问题就是直播加速服务的选取. 老板让我负责直播加速的产品选型,那天老板把我叫到办公室,语重心长地说: ...
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf 在项目中 ...
- HDU 4315 Climbing the Hill [阶梯Nim]
传送门 题意: 和上题基本一样:山顶可以有多人,谁先把king放到山顶谁就胜 并不太明白 #include <iostream> #include <cstdio> #incl ...
- Python tutorial阅读之使用 Python 解释器
配置环境变量后,一般可以直接通过Python或指定Python版本号来调用Python. Python 解释器有些操作类似 Unix shell:当使用终端设备(tty)作为标准输入调用时,它交互的解 ...
- python语言基础汇总
注释 代码中添加注释是一个良好的编程习惯,python语言的注释才用井号'#'作为注释开头的,可以是任意内容,解释器会忽略掉这部分内容.其他每一行都是语句,当语句以冒号':'结尾时,缩进的语句视为代码 ...