start.S详解学习(5):清除 bss 段

清除 bss 段

在这里插入图片描述
在这里插入图片描述
上面代码中的_bss_start,是:

.globl _bss_start
_bss_start:
	.word __bss_start
而_bss_end,是:
.globl _bss_end
_bss_end:
	.word _end
对应的,__bss_start和_end,都在前面提到过的那个链接脚本里面:
u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\u-boot.lds
中的:
__bss_start = .;
.bss : { *(.bss) }
_end = .;

即bss段的起始地址和结束地址

在这里插入图片描述
而此段代码,含义也很清晰,那就是,

先将r2,即0x0,存到地址为r0的内存中去,然后r0地址加上4,比较r0地址和r1地址,即比较当前地址是否到了bss段的结束位置,如果le,little or equal,小于或等于,那么就跳到clbss_l,即接着这几个步骤,直到地址超过了bss的_end位置,即实现了将整个bss段,都清零。

在这里插入图片描述
在这里插入图片描述
上面已经注释掉的代码,此处忽略。

只看最后的那两行,意思也很简单,那就是将地址为_start_armboot中的内容,即start_armboot,赋值给PC,即调用start_armboot函数。

至此,汇编语言的start.S的整个工作,就完成了。

而start_armboot函数,在C文件中:
u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\EmbedSky.c
中:

void start_armboot (void)
{
	...
}

这就是传说中的,调用第二层次,即C语言级别的初始化了,去初始化各个设备了。

其中包括了CPU,内存等,以及串口,正常初始化后,就可以从串口看到uboot的打印信息了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mcr

在这里插入图片描述
CP15系统控制协处理器( CP15,即通常所说的系统控制协处理器(System Control Coprocesssor)。它负责完成大部分的存储系统管理。)

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0151c/ARM920T_TRM1_S.pdf

you can only access CP15 registers with MRC and MCR instructions in a privileged mode. The assembler for these instructions is:
MCR/MRC{cond} P15,opcode_1,Rd,CRn,CRm,opcode_2 

The CRn field of MRC and MCR instructions specifies the coprocessor register to access. The CRm field 
and opcode_2 fields specify a particular action when addressing registers. The L bit distinguishes between an MRC (L=1) and an MCR (L=0).
Note:

Attempting to read from a nonreadable register, or to write to a nonwritable register causes unpredictable results.
The opcode_1, opcode_2, and CRm fields should be zero, except when the values specified are used to select the desired operations, in all 
instructions that access CP15. Using other values results in unpredictable behavior
您只能在特权模式下使用MRC和MCR指令访问CP15寄存器。这些指令的汇编程序是:MCR/MRC{cond}P15,操作码1,Rd,CRn,CRm,操作码2
MRC和MCR指令的CRn字段指定要访问的协处理器寄存器。CRm字段opcode_2字段指定寻址寄存器时的特定动作。L位区分MRC(L=1)和MCR(L=0)。
注:
试图从不可写寄存器读取或写入不可写的寄存器会导致不可预测的结果。

opcode_1、opcode_2和CRm字段应为零,除非指定的值用于选择所需的操作访问CP15的指令。使用其他值会导致不可预测的行为

CP15有很多个寄存器,分别叫做寄存器0(Register 0),到寄存器15(Register 15),每个寄存器分别控制不同的功能,而且有的是只读,有的是只写,有的是可读写。

而且这些寄存器的含义,随着版本ARM内核版本变化而不断扩展,详情请参考这个网址:

http://www.heyrick.co.uk/assembler/coprocmnd.html
其中,根据我们此处关心的内容,摘录部分内容如下:

在这里插入图片描述
而MCR的详细的语法为:

“MCR指令

MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。

指令语法格式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:上述两行代码,其实都可以ARM的官方网站上面找到:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0184b/Chdcfejb.html

在这里插入图片描述
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0184b/Chdifbjc.html

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0184b/Chdifbjc.html

(CP15,即通常所说的系统控制协处理器(System Control Coprocesssor)。它负责完成大部分的存储系统管理。发现果然对于C15的蛮多操作都是对存储的操作。)

控制寄存器 1 的位域含义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0151c/I273867.html
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_Hcoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值