Uboot中start.S源码的指令级的详尽解析_v1.6.pdf

所需积分/C币:17 2014-07-17 11:20:11 3.13MB PDF

Uboot中start.S源码的指令级的详尽解析_v1.6.pdf
图表25AMR7三级流水线 图表26ARM7三级流水线状态 图表27ARM7三级流水线示例 图表28ARM7三级流水线 VS ARM9五级流水线 图表29ARM7三级流水线到ARM9五级流水线的映射 图表30ARM9的五级流水线示例 图表31ARM9的五级流水线中为何PC=PC+8 E 32 ARM Application Procedure Call Standard(AAPcs) 图表33ARM寄存器的别名 图表34数据处理指令的指令格式 图表35mov指令0Xe3a00453的位域含义解析 版本历史 版本 时间 内容 10201104-171详细解释了 uboot的 start.s I中的每行代码; 2添加了相关知识点的详细解释 16201105-011添加汇编学习记录; 2.添加了如何查看C或汇编的源代码所对应的真正的汇编代码 3添加 Start.S的总结 31 Start.s的各个部分的总结; 32 Uboot中的内存的 layout; 4更加详细地解释了为何ARM9中PC=PC+8 5添加了一些其他的细节的内容 6修正一些拼写错误 1正文之前 11.本文内容 此文主要内容就是分析 start.S这个汇编文件的内容,即ARM上电后的最开始那一段的启动过程 12.本文目标 本文的目标是,希望看完此文的读者,可以达到 微观上,对此 start.S的每行,都有了基本的了解 宏观上,对基于ARM核的S3C24X0的CPU的启动过程,有更加清楚的概念 这样的目的,是为了读者看完本文后,再去看其他类似的启动相关的源码,能明白需要做什么事 情,然后再看别的系统是如何实现相关的内容的,达到定程度的触类旁通 总体说就是,要做哪些,为何要这么做,如何实现的,即英语中常说的 do what why do how do 此三方面都清楚理解了,那么也才能算真正懂了。 13.代码来源 所用代码来自TQ2440官网,天嵌的bbs上下载下来的 boote中的源码 u-boot-1. 1.6_20100601\opt\EmbedSky\u-boot-116\cpu\arm920t\start.S 下载地址为 2010年6月最新IQ2440光盘下载( Linux内核, Wince的 eboot, uboot均有更新) http://bbs.embedsky.net/viewthread.php?tid=859 14.关于本文内容的组织飛式 1.类似于这样的代码框 Start.s的代码。。。 中的内睿,是源文件 start.s的汇编代码,紧接着代码框的内容,是代码的解释。 2在 和 之间的代码,是摘自别的文件,非 Estart s的代码。 1.5.阅读此文所要具有的前提知识 阅读此文之前,你至少要对TQ2440的板子有个基本的了解, 以及要了解开发板初始化的大概要做的事情,比如设置输入频率,设置堆栈等等。 另外,至少要有一定的C语言的基础,这样更利于理解汇编代码。 1.6.声明 由于水平有限,难免有误,欢迎指正: green- waste(at)163co 欢迎转载,但请注明作者。 2. start.s详解 下面将详细解释 uboot中的 startS中的每一行代码。详细到,每个指令的语法和含义,都 进行详细讲解,使得此文读者可以真正搞懂具体的含义,即what 以及对于一些相关的问题,深入探究为何要这么做,即why 对于 uboot的 start.s,主要做的事情就是系统的各个方面的初始化 从大的方面分,可以分成这几个部分 (1)设置cPU模式 (2)关闭看门狗 (3)关闭中断 (4)设置堆栈sp指针 (5)清除bss段 (6)异常中断处理 下面来对 start.s进行详细分析,看看每一个部分,是如何实现的。 2.1.设置CPU模式 armboot Startup Code for ARm920 CPU-core Copyright (c)2001 Marius GrEer <mag@sysgo.de> Copyright(c)2002 Alex Z ke <azu@sysgo de> Copyright(c) 2002 Gary Jennejohn <gj@den.de> See file credits for list of people who contributed to this project This program is free software; you can redistribute it and/or modify it under the terms of the gnu general public license as published by the free Software Foundation; either version 2 of the License, or (at your option) any later version This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY or FITNESs FOR A PaRTICULar Purpose See the GNU General Public License for more details You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple place, Suite 330, Boston MA02111-1307USA #include <config h> #include <version. h> 火实火北出出出出为出出北火实北出尘为出北火实北出★为出北出尘肯出★★为 Jump vector table as in table 3. 1 in [1] 诉大大大大大;大北k大诉大大为北;*朵;;北;诉为大六大未;;朵;大大者k globl start gob是个关键字,对应含义为 http://re-eject.gbadev,org/files/gasarmret.pdf 图表1goba的语法 Directive Description Syntax Example global Makes symbolvisible global symbol .global MyAsmFund to the linker globl Same as global globl symbol. globl MyOtherAsmFunc 所以,意思很简单,就是相当于C语言中的 Extern,声明此变量,并且告诉链接器此变量是全局 的,外部可以访问,所以,你可以看到: u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1 1.6\ board(EmbedSky \u-boot.lds 中,有用到此变量·: ENTRY(start) 即指定入口为 start而由下面的 start的含义可以得知, start就是整个 -start.s的最开始,即整个 uboot的代码的开始。 start: b reset stat后面加上一个冒号:,表示其是个标号Labe,类似于C语言goto后面的标号。 而同时,star的值,也就是这个代码的位置了,此处即为代码的最开始,相对的0的位置。 而此处最开始的相对的0位置,在程序开始运行的时候,如果是从 NorFlash启动,那么其地址是 0 stat=0 如果是重新 relocate代码之后,就是我们定义的值了,即,在 u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-116\board\EmbedSky\ config. mk 中的: TEXT BASE = OX33D00000 表示是代码段的基地址,即 startETEXT BASE=Ox33D00000 关于标号的语法解释 http://sourceware.org/binutils/docs-2.20/as/labels.html#labels A labe/is written as a symbol immediately followed by a colon: The symbol then represents the current value of the active location counter, and is, for example, a suitable instruction operand. You are warned if you use the same symbol to represent two different locations: the first definition overrides any other definitions 而_ start标号后面的: reset 就是跳转到对应的标号为 reset的位置 Idr pc,undefined_instruction Idr pc, _software_interrupt Idr pc,__prefetch_abort Idr pc,_data_abort r pc,_not_used Idr pc, irg Idr pc,fiq ldr命令的语法为 http://infocenter.arm.com/help/topic/com.arm.doc.dui_0206hc/dui0206hc_rvct_linkEr and_utilities_guide pdf 图表2LDR指令的语法 4.120LDR 31 28272625242322212019 1615 1211 Hd WI1 adt nude The LDR (Load Register )instruction loads a word from the memory address calculated by addressing mode s and writes it to register <Rd>. If the address 15 not word-aligned, the loaded value 15 rotated right by 8 times the vale of bits[1 0] of the address. For a little-endian memory system, this rotation causcs the addressed byte to occupy the Icast significant byte of thc register. For a big-chdian nemory system, it causes the addressed byte to occupy bits 31: 21]or bits[ 15: 8] of the register, depending on whether bit[o] of the address is 0 or 1 respectively If the PC is specified as register <Rd>, the instruction loads a data woId which it treats as an address, then branches to that address In ARM architecture version 5 and above, bit[O of the loaded vahe determines whether execution continues after this branch in arm state or in Thum state. as though a ex loaded value) iusluctiuu lrd been executed In elie veisivms of the achtettule, bits[1. 0]ofthe loaded value are ignored andexecution continues in ARMstate, as though a MOv PC, (loaded value) instruction had been executed Syntax LDR(<cond>) <Rd>, addressing mode> where- scond? condition field on page A3-5If<cond> is omitted, the AL (always)condition is user e Is the condiion under which the instruction is executed, The conditions are defined in h cRds Specifies the destination register for the loaded value. addressing mode> Is descnbed in Addressing Made 2-Laad and Store Word or Unsigned Byte on page A5-15 It determines the l P U. w. Rn and addr mode bits of the instruction. The syntax of all forms of <addressing mode includes a basa register<Rn>. Some forms also specify that the instruction modifies the base register value(this is known as base register wwitebach) http://wenku.baidu.com/view/f7cc280102020740bele9bea.html LDR指令的格式为 LDR条件}目的寄存器,<存储器地址> LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器 中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时, 指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设 计中比较常用,且寻址方式灵活多样,请读者认真掌握 指令示例: LDR RO, [R1 将存储器地址为R1的字数据读入寄存器R0 LDRR0,[R1,R2]将存储器地址为R1+R2的字数据读入寄存器R0。 LDRR0,[R1,#8];将存储器地址为R1+8的字数据读入寄存器R0。 LDRR0,[R1,R2]!将存储器地址为R1+R2的字数据读入寄存器RO并将新地址R1+R2写 入R1 LDRR0,[R1,#8]!;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写 入R1。 LDRR0,[R1],R2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写 入R1。 LDR RO,R1,R2,LSL#2]!将存储器地址为R1+R2×4的字数据读入寄存器R0,并将 新地址R1+R2×4写入R1 LDRR0,[R1,R2,LSL#2;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2×4写入R1。 http://www.pczpg.com/a/2010/0607/11062.html ARM是RISC结构数据从內存到CP∪之间的移动只能通过L/S指令来完成也就是ldr/st指令。 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldrr0.0x12345678 就是把0×12345678这个地址中的值存放到r0中。 上面那些ldr的作用,以第一个 undefined instruction为例,就是将地址为 undefined instruction中的一个word的值,赋值给pc undefined instruction: word undefined instruction software_interrupt: word software_interrupt prefetch_abort: word prefetch_abort data abort: word data abort not use ed: word not used word irg fi word fig http://blogold.chinaunix.net/u3/115924/showart_2280163.html "word. word expr{expr}….分配一段字内存单元,并用exp初始化字内存单元(32bit) http://re-eject.gbadev.org/files/gasarmref.pdf 图表3Word的语法 Directive Description Syntax Example word Define word expr word expr t,.J Word144511,0x11223 (32bit numbers) 所以上面的含义,以 undefined instruction为例,就是,此处分配了一个word=32bit=4字节 的地址空间,里面存放的值是 undefined instruction。 而此处 undefined instruction也就是该地址空间的地址了。用C语言来表达就是 undefined instruction= &undefined instruction 或 x undefined instruction undefined instruction

...展开详情
img
yu1shui

关注 私信 TA的资源

上传资源赚积分,得勋章
最新资源