嵌入式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) 当应用程序执行系统调用, ...
随机推荐
- TCP之再谈解决服务器TIMEWAIT过多的问题
原则 TIMEWAIT并不是多余的.在TCP协议被创造,经历了大量的实际场景实践之后,TIMEWAIT出现了,因为TCP主动关闭连接的一方需要TIMEWAIT状态,它是我们的朋友.这是<UNIX ...
- Python学习--使用dlib、opencv进行人脸检测标注
参考自https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/ 在原有基础上有一部分的修改(image ...
- es head插件通过Nginx http basic 限制访问
原文链接: http://www.sojson.com/blog/213.html
- 《Thinking in Java》学习笔记(一)
服务器端的编程可以参考另一本书<企业Java编程>(Thinking in Enterprise Java). 1.基本类型 基本型别 大小 最小值 最大值 默认值 boolean -- ...
- 数据分析之pandas教程------数据处理
目录 1 数据合并 1.1 实现数据库表join功能 1.2 实现union功能 2 数据转换 2.1 轴旋转 2.2 数据转换 2.2.1 去重 2.2.2 对某一列运用函数 2.2 ...
- python怎么实现数组增加一行或多行
对数组增加一行或一列很简单,网上一搜一大把的事例.比如增加一行或一列: import numpy as np a = np.array([[1, 2, 3]]) row = a[0] col = a[ ...
- 阶段小项目1:循环间隔1秒lcd显示红绿蓝
#include<stdlib.h>#include<stdio.h>#include<string.h>#include<error.h>#inclu ...
- [Python Study Notes]批量将ppt转换为pdf v1.0
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- Quartz.NET 3.0 正式发布
Quartz.NET是一个强大.开源.轻量的作业调度框架,你能够用它来为执行一个作业而创建简单的或复杂的作业调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等.在2017 ...
- elasticsearch2.3.3集群搭建踩到的坑
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 作者原来搭建的环境是0.95版本 现在升级到2.3.3版本, ...