裸机代码(uboot) : clear bss
一. bss介绍:
代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]
bss和data的区别:
全局的未初始化变量存在于.bss段中,具体体现为一个占位符;
全局的已初始化变量存于.data段中; .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);
而.data却需要占用,其内容由程序初始化。 若这样定义一个全局变量:int g_inBss[] ;
则它在.bss段,这里占用占位符的空间。 若这样定义一个全局变量:int g_inData[] ={,,,,,,,,};
则它在.data段,程序占用数组全部大小的空间。 bss和data的联系:
都在rw区域;
bss段在运行起来成为进程之后,占的空间大小和data就相同了。
二. 分析uboot代码中的clearbss段的代码:
_bss_start 和 __bss_start
====================================
1. u-boot-1.1.6/board/100ask24x0/u-boot.lds
......
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/100ask24x0/boot_init.o (.text)
*(.text)
}
......
......
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
__bss_start 是bss段的起始地址,
_end 是bss段的终止地址.
====================================
2. u-boot-1.1.6/cpu/arm920t/start.S
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
分析{
.word .word expr {,expr}… 分配一段字内存单元,幵用expr初始化字内存单元(32bit)
关亍 _bss_start 和 _bss_end 都是两个标号,对应着此处的地址。
而两个地址里面分别存放的值是 __bss_start 和 _end,
}
====================================
3. 汇编的清零bss段:
clear_bss:
ldr r0, _bss_start /* find start of bss segment */
ldr r1, _bss_end /* stop here */
mov r2, #0x00000000 /* clear */
clbss_l: str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
ble clbss_l
{
ldr r0, _bss_start 表示装载 _bss_start 地址中的值,即装载 __bss_start
ldr r0, _bss_end 表示装载 _bss_end 地址中的值,即装载 _end
}
====================================
4. 网上找的c语言中的clear_bss, 觉得有问题:
void clean_bss(void)
{
extern int __bss_start, _end;
int *p = &__bss_start;
for (; p < &_end; p++)
*p = 0;
}
&__bss_start 就是: _bss_start
&_end 就是: _bss_end
从c语言语法上看,__bss_start和_end和bss段代表bss段的起始地址和终止地址.
但是_bss_start和_bss_end却不能代表bss段的起始地址和终止地址, 因此我得出了这个结论: "clean_bss中那个for循环并不能起到清零bss段的作用."
裸机代码(uboot) : clear bss的更多相关文章
- linux上使用J-Link调试S3C2440裸机代码
linux上使用J-Link调试S3C2440裸机代码 工具: segger的jlink仿真器 segger的jlink for linux 交叉编译工具链里面的arm-xx-linux-xx-gdb ...
- s3c2440裸机-代码重定位、清bss的改进和位置无关码
1.代码重定位的改进 用ldr.str代替ldrb, strb加快代码重定位的速度. 前面重定位时,我们使用的是ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDR ...
- u-boot中bss段的使用
近日在调试uboot时,发现了一个现象,即在relocate_code前如果给未初始化或者初始化值为0的变量赋值的话,则在relocate_code后程序无法正常执行.经过学习,恶补如下知识 BSS段 ...
- s3c2440裸机-代码重定位(2.编程实现代码重定位)
代码重定位(2.编程实现代码重定位) 1.引入链接脚本 我们上一节讲述了为什么要重定位代码,那么怎么去重定位代码呢? 上一节我们发现"arm-linux-ld -Ttext 0 -Tdata ...
- s3c2440裸机-代码重定位(1.重定位的引入,为什么要代码重定位)
1.重定位的引入(为什么要代码重定位) 我们知道s3c2440的cpu从0地址开始取指令执行,当从nor启动时,0地址对应nor,nor可以像内存一样读,但不能像内存一样写.我们能够从nor上取指令执 ...
- STM32CubeMX+Keil裸机代码风格(2)
10.找到STM32cubeMx所建的工程目录,在工程目录的同级目录下新建一个文件夹用来存放自己写的代码 11.用notepad++打开keil的工程文件,在这里的<Group>前面加上 ...
- STM32CubeMX+Keil裸机代码风格(1)
1.打开STM32CubeMX,New project 选好自己要用的芯片 2.选上左侧SYS中的debug Serial Wire(定义烧程序的端口) . 3,选上左侧TIM6,使TIM6可用(TI ...
- 记录 用tiny6410 j-link eclipse 在线调试裸机代码leds
1.nand flash烧写uboot 并且启动nandflash uboot,用来初始化6410,进入uboot命令行界面 2.在terminal中输入JLinkGDBServer -device ...
- arm裸机通过uboot运行hello world程序测试结果
开发板EasyARM i.MX280A CPU:arm926ejs helloworld程序使用的编译器 (1)arm-fsl-linux-gnueabi-gcc version gcc4.4.4 ...
随机推荐
- DjangoORM一对多&多对多操作
简要说明 通过操作对象的方式操作数据库 详细步骤 models.py的结构是: 如果models.py中外键定义没有写 related_name='student_teacher', 可以直接用 st ...
- Garbage
垃圾回收 http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/ http://blog.jobbole ...
- python网络编程-01
python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...
- php基础知识笔记
基本语法 php文件的后缀名可以是 .php .php3 .phtml 输出命令 echo , print 语句以;结束 注释 // /* */ 变量都带$前缀, 如: $x, $names, $th ...
- IC封装
1.QFN •QFN—Quad Flat No-lead Package 四方无引脚扁平封装 2.SOIC •SOIC—Small Outline IC 小外形IC封装 3.TSSOP •TSSOP— ...
- Euromonitor 2013年奢侈品报告精选 |华丽志
Euromonitor 2013年奢侈品报告精选 |华丽志 Euromonitor 2013年奢侈品报告精选
- STL-multimap
转自:http://www.cnblogs.com/xiaoka/archive/2011/08/09/2132342.html multimap提供了可以一种可以有重复键值的STL map类型.其插 ...
- new Date()的参数
前两天发现手机页面的倒计时在Android上正常显示,在iPhone却不能显示. 后来又发现在ff和ie里也不显示.(以前只在chrome里看过,显示正常). 后来同事改了new Date()里字符串 ...
- jbpmAPI-3
第三章.jBPM安装程序 3.1 .先决条件这个脚本假设您具备Java JDK 1.6 +(设置JAVA_HOME),和Ant 1.7 +安装.如果你没有,请使用以下链接下载并安装:Java:http ...
- Google地图,Baidu地图数据供应商
http://janwen.iteye.com/blog/488659 Google百度 我老以为百度,Google的地图产品是自己开发的,原来是别人提供的数据, 百度的数据提供商有 北京世纪高通科 ...