Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2161199
  • 博文数量: 361
  • 博客积分: 10828
  • 博客等级: 上将
  • 技术积分: 4161
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-20 14:34
文章分类

全部博文(361)

文章存档

2011年(132)

2010年(229)

分类: C/C++

2011-03-28 14:03:30

昨天晚上碰到个ads下c库的malloc内存分配的问题。

程序一跑到malloc和memset就异常中断,一直都不知道原因。 今天查了些资料,稍微对ads下无os支持下的malloc有

了初步的认识。

一:堆的基地址

由于malloc是需要在堆空间上进行内存分配的,因此需要知道堆空间的基地址,而堆空间的地址一般

有2种方式获取:

1. 是由编译器默认获取,编译器会默认将堆的地址设置在ZI区的末端,也就是变量 IMAGE$$ZI$$LIMITE的值为

堆地址基地址。

2. 由scatter文件来设置。 看有些资料上说,如果用分散加载文件进行堆空间的划分,则需要进行堆栈空间的初始化

操作。也就是要需要进行 __user_initial_stackheap来设置堆栈地址

二。设置了堆栈地址,系统如何知道分配

要让系统在调用malloc的时候知道堆地址,有2种方式:

1. 调用c标准main函数,而非Main等。

系统在调用main函数的时候,会调用系统的__main函数,在这个函数里头获取系统的堆栈地址,比如

__user_initial_stackheap就是在这个时候进行调用,获取堆栈地址的。

2. 调用自定义Main函数

这个时候就需要自己设定堆栈地址,_init_alloc(base,top)来进行设置堆栈地址。

总结: 需要用系统的malloc函数的话,则需要让系统知道堆栈的空间, 如果用c的跳转接口用c标准main

函数的话,则不需要手动进行设置堆栈空间,如果用了分散加载文件就需要进行_user_intial_stackheap

初始化。

另外一个memset的问题,目前还不清楚,可能是memset的参数没有进行(void *)或者(char *)进行类型

转换。

阅读(1450) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~