关于bss段中清零,__bss_start,__bss_end,

brooke_wangjun 2014-06-20 04:55:58
连接脚本
SECTIONS {
. = 0x00000000;
.init : AT(0){ head.o init.o nand.o}
. = 0x30000000;
.text : AT(4096) { *(.text) }
.rodata ALIGN(4) : AT((LOADADDR(.text)+SIZEOF(.text)+3)&~(0x03)) {*(.rodata*)}
.data ALIGN(4) : AT((LOADADDR(.rodata)+SIZEOF(.rodata)+3)&~(0x03)) { *(.data) }
__bss_start = .;
.bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end = .;
}
清除BSS段
void clean_bss(void)
{
extern int __bss_start, __bss_end;
int *p = &__bss_start;

for (; p < &__bss_end; p++)
*p = 0;
}
关键是为什么要取__bss_start的地址,__bss_start代表什么
...全文
7832 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanqingwu 2015-07-15
  • 打赏
  • 举报
回复
bss 段一般是你在程序中定义了,运行时,要先初始化为0 的变量。 在运行前要将这段内存全部清0,保证运行时为0.
猪头三小队长 2015-06-24
  • 打赏
  • 举报
回复
楼主贴出来的lds中已经定义了啊,就在data段之后,一般情况下会在栈之前 __bss_start = .; .bss ALIGN(4) : { *(.bss) *(COMMON) } __bss_end = .;
zhaigch 2015-06-22
  • 打赏
  • 举报
回复
二楼正解。你可以用串口打印出__bss_start __bss_end 与 &__bss_start &__bss_end看下。
猪头三小队长 2014-06-23
  • 打赏
  • 举报
回复
一般情况下是由链接器自动生成的符号,直接在加载代码中引用即可,至于你的loader要和链接器怎么配合,完全是你自己可以决定的事,你自己也完全可以实现一个elf解释和加载器。 bss段存放未初始化的(也许也包括初始化为0的)全局变量,以及所有的静态变量。
fly 100% 2014-06-22
  • 打赏
  • 举报
回复
这个肯定在连接脚本中定义的 查查.lds
ychongx 2014-06-21
  • 打赏
  • 举报
回复
__bss_start 表示全局未初始化变量的开始地址,clean_bss函数作用就是把全局未初始化变量初始化为0

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧