一. 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的更多相关文章

  1. linux上使用J-Link调试S3C2440裸机代码

    linux上使用J-Link调试S3C2440裸机代码 工具: segger的jlink仿真器 segger的jlink for linux 交叉编译工具链里面的arm-xx-linux-xx-gdb ...

  2. s3c2440裸机-代码重定位、清bss的改进和位置无关码

    1.代码重定位的改进 用ldr.str代替ldrb, strb加快代码重定位的速度. 前面重定位时,我们使用的是ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDR ...

  3. u-boot中bss段的使用

    近日在调试uboot时,发现了一个现象,即在relocate_code前如果给未初始化或者初始化值为0的变量赋值的话,则在relocate_code后程序无法正常执行.经过学习,恶补如下知识 BSS段 ...

  4. s3c2440裸机-代码重定位(2.编程实现代码重定位)

    代码重定位(2.编程实现代码重定位) 1.引入链接脚本 我们上一节讲述了为什么要重定位代码,那么怎么去重定位代码呢? 上一节我们发现"arm-linux-ld -Ttext 0 -Tdata ...

  5. s3c2440裸机-代码重定位(1.重定位的引入,为什么要代码重定位)

    1.重定位的引入(为什么要代码重定位) 我们知道s3c2440的cpu从0地址开始取指令执行,当从nor启动时,0地址对应nor,nor可以像内存一样读,但不能像内存一样写.我们能够从nor上取指令执 ...

  6. STM32CubeMX+Keil裸机代码风格(2)

    10.找到STM32cubeMx所建的工程目录,在工程目录的同级目录下新建一个文件夹用来存放自己写的代码 11.用notepad++打开keil的工程文件,在这里的<Group>前面加上 ...

  7. STM32CubeMX+Keil裸机代码风格(1)

    1.打开STM32CubeMX,New project 选好自己要用的芯片 2.选上左侧SYS中的debug Serial Wire(定义烧程序的端口) . 3,选上左侧TIM6,使TIM6可用(TI ...

  8. 记录 用tiny6410 j-link eclipse 在线调试裸机代码leds

    1.nand flash烧写uboot 并且启动nandflash uboot,用来初始化6410,进入uboot命令行界面 2.在terminal中输入JLinkGDBServer -device ...

  9. arm裸机通过uboot运行hello world程序测试结果

    开发板EasyARM i.MX280A CPU:arm926ejs helloworld程序使用的编译器 (1)arm-fsl-linux-gnueabi-gcc  version gcc4.4.4 ...

随机推荐

  1. OC中没有实现NSCopying技术时的深复制技术

    最近看书看到一种新的实现深复制对象的技术,使用Foundation的归档技术,下面是代码: NSData *data = [NSKeyedArchiver archivedDataWithRootOb ...

  2. java核心技术学习笔记之一程序设计概述

    Java 核心技术之一程序设计概述 一.   Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向 ...

  3. 阿里云ECS每天一件事D7:安装tomcat8.0

    这一D,跨越了几个月啊,人是越来越懒,集中写一些,就懒得再记录了.也是因为测试需要,搭建个jsp的服务环境,只是测试,考虑用tomcat就够了. 在Tomcat官网下载最新Core版本,下载之后,将文 ...

  4. kafka初探

    http://www.infoq.com/cn/articles/kafka-analysis-part-1

  5. The Building Blocks-Components of EA part 1- Information and Strategy

    1. Zachman Framework Presented as matrix of Rows and Columns representing domain of interest and lev ...

  6. Cookie获取、设置值

    设置: HttpCookie cookie = new HttpCookie("cookieName"); cookie.Value = "name1" Htt ...

  7. Windows配置Python编程环境

    1.安装Python https://www.python.org/ 2.修改环境变量 将安装python的路径加到path路径 3.配置notepad++ a. notepad++/运行/“运行”按 ...

  8. Ubuntu 12.04环境下配置Postgresql和phppgadmin

    Ubuntu 12.04环境下配置Postgresql 9.1 和phppgadmin 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianb ...

  9. input file 模拟

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  10. SIF与CIF

    SIF 动态图像专家组(MPEG)在1992年推出的MPEG-1标准中首次定义了SIF(Source Input Format,源输入格式).CCIR 601标准(现改为ITU-R BT.601标准) ...