清除 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