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

简介: 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

目录
相关文章
|
4月前
|
存储 监控 安全
JVM内存问题之如何比较不同时间点的pmap输出以检查新增或变大的内存段
JVM内存问题之如何比较不同时间点的pmap输出以检查新增或变大的内存段
|
6月前
|
存储 Oracle 关系型数据库
Oracle的段:深入数据段与日志段的奥秘
【4月更文挑战第19天】Oracle数据库中的数据段和日志段是存储管理的核心。数据段存储表和索引的实际数据,随数据增长动态调整;日志段记录变更历史,保障数据完整性和恢复。两者协同工作,确保数据库稳定性和并发控制。了解和优化它们的配置能提升数据库性能和可靠性,为业务发展提供支持。
|
6月前
|
存储 程序员
【汇编】Loop指令、段前缀
【汇编】Loop指令、段前缀
470 0
【汇编】Loop指令、段前缀
|
6月前
|
Linux 编译器 C语言
start.S详解学习(四):设置堆栈 sp 指针
start.S详解学习(四):设置堆栈 sp 指针
272 0
|
存储 程序员 编译器
C语言内存分区(堆,栈,全局/静态存储区,自由存储区,代码区)与可执行程序的三段-(Text段,Date段,Bss段)
C语言内存分区(堆,栈,全局/静态存储区,自由存储区,代码区)与可执行程序的三段-(Text段,Date段,Bss段)
249 0
|
应用服务中间件 nginx
|
物联网 Linux 开发者
Exec 之后进程保留的属性|学习笔记
快速学习 Exec 之后进程保留的属性
汇编(三)段地址、偏移地址、内存单元、寄存器、CS、IP、代码段、debug、实验题
段地址、偏移地址、内存单元、寄存器、CS、IP、代码段、debug、实验题、汇编、汇编编程、win10怎么使用debug
10670 2