有关.BSS的分配问题

[复制链接]
5331|10
 楼主| wanrenyong 发表于 2011-11-18 11:07 | 显示全部楼层 |阅读模式
我是新手,向在大家请下.bss区的问题。

我们知道.bss区是用来存放未初始化的(uninitailized)全局变量(global)和未初始化的静态变量。在lm3s bootloader 的汇编代码中是把栈分配在.bss区的,.bss 区是不会编入image的,那么在实际运行过程中.bss区是分配到哪个地址的?是编译器在链接的时候指定好了的吗?.bss是在什么时候分配的?如果.bss的地址是先固定的,那么boot loader在启动时从flash拷贝代码到ram中的时候,会不会把.bss区覆盖掉,如果覆盖了,那么在将.bss区初始为0的时候又会把代码覆盖掉,这样程序就出错了?

请大侠解释一下,非常感谢。
sphinz 发表于 2011-11-18 12:29 | 显示全部楼层
你从linker文件中查看一下.bss的起始地址,这些都是编译器做的工作。
 楼主| wanrenyong 发表于 2011-11-18 13:03 | 显示全部楼层
2# sphinz

能说得具体一些嘛?
永远的不知 发表于 2011-11-18 13:34 | 显示全部楼层
1# wanrenyong

可以打开.map文件,看看就都明白了。
TI_MCU 发表于 2011-11-18 14:05 | 显示全部楼层
.bss区都在SRAM里面的,堆栈显然也应该在SRAM里面。lm3s代码直接可以在flash里执行,如果要拷贝到SRAM里面执行需要考虑你说到的问题。
 楼主| wanrenyong 发表于 2011-11-18 14:59 | 显示全部楼层
4# 永远的不知

OK,.map是可以看到的,但是问题是,问题是从flash拷到sram中,肯定会存在覆盖的情况,我怎么去避免呢?谢谢。
 楼主| wanrenyong 发表于 2011-11-18 15:00 | 显示全部楼层
6# wanrenyong

有什么办法可以避免吗?
永远的不知 发表于 2011-11-18 15:48 | 显示全部楼层
4# 永远的不知  

OK,.map是可以看到的,但是问题是,问题是从flash拷到sram中,肯定会存在覆盖的情况,我怎么去避免呢?谢谢。
wanrenyong 发表于 2011-11-18 14:59


  1.     Updater                                  0x200002c5   Thumb Code   418  bl_main.o(i.Updater)
  2.     g_ucStatus                               0x20000488   Data           1  bl_main.o(.data)
  3.     g_ulTransferSize                         0x2000048c   Data           4  bl_main.o(.data)
  4.     g_ulTransferAddress                      0x20000490   Data           4  bl_main.o(.data)
  5.     g_pucDataBuffer                          0x20000494   Data           4  bl_main.o(.data)
  6.     Image$$SRAM$$ZI$$Base                    0x20000498   Number         0  bl_main.o(.bss)
  7.     g_pulDataBuffer                          0x20000498   Data          80  bl_main.o(.bss)
  8.     Image$$SRAM$$ZI$$Limit                   0x200005a8   Number         0  bl_startup_rvmdk.o(.bss)


从TI的bootloader例程的.map文件可以看出,代码从flash复制到ram的0开始到Image$$SRAM$$ZI$$Base(0x20000498 )的区域;并不会覆盖.bss区域;

比如,在keil中,link的.sct文件内容如下,已经ram中把代码的区域已经预留出来了。
FLASH 0x00000000 0x00010000
{
    ;
    ; Place the vector table and reset handlers into flash.
    ;
    RESET 0x00000000 0x00010000
    {
        *.o (RESET, +First)
    }
    ;
    ; Place everything else remaining into SRAM (RO, RW, and ZI)
    ;
    SRAM +0x20000000 0x00010000
    {
        * (+RO, +RW, +ZI)
    }
}
 楼主| wanrenyong 发表于 2011-11-18 16:37 | 显示全部楼层
OK,我已经搞明白了,是通过.sct文来来实现的.
 楼主| wanrenyong 发表于 2011-11-18 16:38 | 显示全部楼层
非常感谢各位。
sphinz 发表于 2011-11-19 11:13 | 显示全部楼层
不知是大牛,以后他说什么,你相信就是了。。哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部