s3c6410 uboot代码分析
一些伪指令的时候
*/
--------------------
.globl _armboot_start
_armboot_start:
.word _start
--------------------
/*
下面的代码__bss_start的值是在u-boot.lds脚本里面定义的,虽然没给值,但是你要知道文件的大小和位置是由
编译器指定的,那么还需要我们告诉它值吗?所以没值胜有值啦,由编译时编译器决定它们的值
*/
--------------------
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
--------------------
/*
uboot开始执行的第二条代码处即在这里了,下面的代码使得cpu的模式为管理模式,如果想使得为cpu为管理模式,需要保证cpsr寄存
器的最低5位为10011,下面是把0xd3的值赋值给cpsr,0xd3即1101 0011,最高两位置1的意思为关闭中断和快中断,这是为了防止代码
正在执行时,产生外部中断,导致程序跳转到异常向量表而无法正常按顺序执行。5位为0的意思是cpu的状态为arm状态,如果是1则cpu进入thumb态,thumb态处理16位指令代码和数据。
*/
--------------------
reset:
mrsr0,cpsr
bicr0,r0,#0x1f
orrr0,r0,#0xd3
msrcpsr,r0
--------------------
/* 以下标号所在处的代码比较多,将做逐步分析,这段代码主要的工作也就是改了一些硬件寄存器和内存初始化工作 */
--------------------
cpu_init_crit:
--------------------
/*
指令的含义为刷新指令和数据缓存。mcr的意思是把arm寄存器的值赋值给coprocesser寄存器,拿第一条指令来说,
p15代表协处理器,0为一定的值,指令中0b0000四位来表示,现在无具体作用,如果不是0则结果未知,后面的r0是即将写入
c7目标寄存器中的值,后面还有个c7所代表的意思为额外操作码,如果不是c0,则表示的是同一个寄存器的不同物理寄存器,因为
同一个寄存器的名字并不代码通一个物理内存,我们在学rpsr的时候应该知道这点,最后的0提供附加信息,用于区分同一寄存器的
不同物理寄存器,如无附加信息,请保持为0值,否则结果不可预测
下面三行代码不难看出,c7、c8的值被清为0,为什么要清为零呢,你需要去看arm1176jzf-s芯片手册了,其中是有说明的,不再累述,
arm1176jzf-sarm核芯片手册下载地址httop://www.arm.com,也可以与本人联系获取。
*/
--------------------
movr0, #0
mcrp15, 0, r0, c7, c7, 0/* flush v3/v4 cache */
mcrp15, 0, r0, c8, c7, 0/* flush v4 TLB */
--------------------
/*
实在不想解释这段,因为以前看过芯片手册的解释,且不止一遍,对于这里面要更改的内容就是不能全部记下来,和工作有关了,
不能全心搞这块内容,最多2个月左右的时间能回来回顾一下了。总之还是去查arm11核芯片手册,因为以下改的内容是协处理器
c1,那么你就该去查c1是用来干什么的。查看得知,是控制寄存器,查看手册是online books12.2.2 Primary register allocation
一节,其中13,9,8位为V、R、S:V位是对高端异常向量表的支持,如果选择0异常向量表为0x00000000-0x0000001c,如果选择
1异常向量表就是FFFF0000-FFFF001c;R位用于ROM保护的,具体的还要与c5里面的配合,这都是MMU惹的祸,很烦,但是现在
我们还没有讲到MMU,所以为什么这样做,也必须到讲到MMU的时候才见分晓了,S在这里面的意思也是用于系统保护的,和MMU
又是有很大的关系,好吧,后面会找MMU算账的,这里就先不深入了,接下来再分析下下面的指令含义
bicr0, r0, #0x00000087@ clear bits 7, 2:0(B--- -CAM) 的B位为0表示支持小little-endian,1表示支持big-endian格式的系统内存
CAM为第三位,M为0代表禁止MMU,反之打开,A代表地址对齐检查,0代表禁止,C代表指令数据cache控制,0为禁止
orrr0, r0, #0x00000002@ set bit 2 (A) Align 这段指令又比较犯贱了,打开地址对齐检查了,这是应该的O(∩_∩)O~,后面又
设置12位为1,含义是如果数据cache和指令cache是分开的话,这里面置1的含义将会打开指令缓存
*/
--------------------
mrcp15, 0, r0, c1, c0, 0
bicr0, r0, #0x00002300@ clear bits 13, 9:8 (--V- --RS)
bicr0, r0, #0x00000087@ clear bits 7, 2:0 (B--- -CAM)
orrr0, r0, #0x00000002@ set bit 2 (A) Align
orrr0, r0, #0x00001000@ set bit 12 (I) I-Cache
mcrp15, 0, r0, c1, c0, 0
--------------------
/*
以下代码的作用是为了给256M的内存在MMU开启的时候把0x70000000作为重映射的基地址
c15协处理器寄存器在s3c6410上有特殊作用,它是外部内存端口映射寄存器,32位,在开关MMU的时候发生作用,且优先级最高
这里的0x70000000为外
s3c6410uboot代码分 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)