s3c6410 uboot代码分析
强调,内容与三星原厂提供的uboot-1.1.6有更改的地方,因为外接外设的区别,特别是nand_flash、外接网卡芯片和LCD芯片
以下纯代码情景分析,请结合uboot的功能结构图和内存分布图查看代码,这样会更加容易理解。
s3c-u-boot-1.1.6源代码可以在三星下面的网站获得,但前提是你有官方的email。
还是百度google搜一下吧,当然我这也是有的哦。
http://www.samsung.com/global/business/semiconductor/productInfo.do?fmly_id=835&partnum=S3C6410
功能结构图(上图) uboot内存分布图(上图)
1.start.s代码分析(第一阶段)
/*以下是具有arm特色的异常向量表,为中断异常准备 */
--------------------
.globl _start
_start: breset
ldrpc, _undefined_instruction
ldrpc, _software_interrupt
ldrpc, _prefetch_abort
ldrpc, _data_abort
ldrpc, _not_used
ldrpc, _irq
ldrpc, _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
_pad:
.word 0x12345678 /* now 16*4=64 */
.global _end_vect
_end_vect:
.balignl 16,0xdeadbeef
--------------------
/*当发生中断异常时,pc会跳转到.word的后面地址处 处理异常,
undefined异常由arm核译码单元检测,并触发未定义指令异常请求,硬件设置pc的值为0x4,强制程序从内存0x4地址执行指令;
0x8存放软件中断处理指令,arm中使用swi指令时触发软件中断,硬件设置PC的值为0x8,同时进入系统模式,多用在系统库的编写;
prefetch异常,预取指中止异常,导致正在取的指令无法正常取出,这里需要注意流水线造成的pc值;
data中止,无法获取数据,产生的原因有可能是内存未准备好、内存无读或写权限等一些原因产生的异常;
0x14暂时未使用;
0x18提供系统硬件中断跳转接口,一般我们的处理器都会引出很多的外部中断线,在这里能做的就是判断系统中断线产生的中断,注册中断,初始化中断,调用中断函数等等;
0x1c地址为_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
_pad:
.word 0x12345678 /* now 16*4=64 */
.global _end_vect
_end_vect:
.balignl 16,0xdeadbeef
--------------------
/*
_TEXT_BASE标号所代表的是uboot代码的运行地址,对于s3c6410
系统来说,如果nand flash启动方式,系统会把0xc000000里面前4KB的内容映射到引导镜像区,即0x0地址,但是我们需要把
uboot代码放到我们的SDRAM,原因是我们代码里面需要对变量做更改并且增加代码执行效率等
下面代码的含义是定义uboot程序执行的运行地址,值为0xc7e00000,.word后面的值TEXT_BASE在编译的时候,
通过向编译器传递参数获得,-DTEXT_BASE方式向编译器传递宏参,在编译的时候可以注意下编译的时候都会指定它的值,值得定义在
config.mk中,Makefile会包含它。
*/
--------------------
_TEXT_BASE:
.wordTEXT_BASE
--------------------
/*
在uboot里面会开启MMU,下面是在MMU开启前uboot在内存存放的真实物理地址,值为0x57e00000。强调一下,我们做的开发板的SDRAM在DMC1上,即访问物理内存的实际物理地址从0x50000000开始,SDRAM的大小为256M,正好是一个DMC1,所以内存的访问地址就是0x50000000-0x6FFFFFFF之间了。
*/
--------------------
_TEXT_PHY_BASE:
.wordCFG_PHY_UBOOT_BASE
--------------------
/*
这个不解释也是可以的,但是还是要解释。很多人对_start的值有疑惑,认为是0x0,因为看到_start的标号在代码段最开始处,其实是错误的,汇编代码里面的标号是和编译时指定的运行地址有关系的。我们在编译程序的时候会通过-DTEXT_BASE=0xc7e00000参数告诉编译器我们程序将会运行在0xc7e00000地址,那么自然编译器会认为代码开始的时候就运行在这个地址,那么_start的值自然就是0xc7e00000了。总结之,标号的值与编译时指定的程序地址有关系,而与程序实际存放在内存出的位置无关。小心使用哦。特别在使用
s3c6410uboot代码分 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)