打印

有关.BSS的分配问题

[复制链接]
4070|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文件,看看就都明白了。

使用特权

评论回复
5
TI_MCU| | 2011-11-18 14:05 | 只看该作者
.bss区都在SRAM里面的,堆栈显然也应该在SRAM里面。lm3s代码直接可以在flash里执行,如果要拷贝到SRAM里面执行需要考虑你说到的问题。

使用特权

评论回复
6
wanrenyong|  楼主 | 2011-11-18 14:59 | 只看该作者
4# 永远的不知

OK,.map是可以看到的,但是问题是,问题是从flash拷到sram中,肯定会存在覆盖的情况,我怎么去避免呢?谢谢。

使用特权

评论回复
7
wanrenyong|  楼主 | 2011-11-18 15:00 | 只看该作者
6# wanrenyong

有什么办法可以避免吗?

使用特权

评论回复
8
永远的不知| | 2011-11-18 15:48 | 只看该作者
4# 永远的不知  

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

 
    Updater                                  0x200002c5   Thumb Code   418  bl_main.o(i.Updater)
    g_ucStatus                               0x20000488   Data           1  bl_main.o(.data)
    g_ulTransferSize                         0x2000048c   Data           4  bl_main.o(.data)
    g_ulTransferAddress                      0x20000490   Data           4  bl_main.o(.data)
    g_pucDataBuffer                          0x20000494   Data           4  bl_main.o(.data)
    Image$$SRAM$$ZI$$Base                    0x20000498   Number         0  bl_main.o(.bss)
    g_pulDataBuffer                          0x20000498   Data          80  bl_main.o(.bss)
    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)
    }
}

使用特权

评论回复
9
wanrenyong|  楼主 | 2011-11-18 16:37 | 只看该作者
OK,我已经搞明白了,是通过.sct文来来实现的.

使用特权

评论回复
10
wanrenyong|  楼主 | 2011-11-18 16:38 | 只看该作者
非常感谢各位。

使用特权

评论回复
11
sphinz| | 2011-11-19 11:13 | 只看该作者
不知是大牛,以后他说什么,你相信就是了。。哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝