5414|4

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

标准C库函数malloc的实现机制 [复制链接]

这个问题已经不止一个人在论坛里问过了,但是回帖的答案种种,侧重点也不同。

我的疑问:不在于分配策略,而在于分配的堆空间是如何得到的。
在嵌入式开发中,需要自己实现malloc,free的功能。典型的做法是,用户自定义一个大数组作为动态内存分配的堆空间,然后malloc,free就可以按一定算法来实现内存管理了。在此种情况下,需要用户先调用初始化堆的函数来将大数组的地址与大小传递给内存管理中记录堆信息的相关变量。
那么,标准的C库函数malloc是如何定位这个堆的位置的,因为我们平时编制C程序时,并没有对堆的初始化操作。它是不是要调用到OS的系统函数来取得堆空间?如果是,那在windows下的C标准库与在linux下的C标准库的实现应该不同?(linux源码中有malloc.c文件,但是它已经说明了这是系统的api,跟程序开发环境中的C库malloc并不是一个概念)。

谢谢。

最新回复

LZ是要自己来维护一个堆,还是要自己管理内存(无操作系统)?前者是向操作系统申请一块空间,然后自己管理在此空间内小块内存的分配和释放,由操作系统来处理内存页映射;后者则需要自己设计描述符表、页映射表,如果使用虚拟内存还要自己处理页故障。  详情 回复 发表于 2008-4-28 17:15
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1. 对堆的初始化在第1个malloc函数中进行,在malloc.c中有个全局变量__malloc_state,它被用来标识堆的状态
2. 要通过sbrk调用向内核申请内存
3. 在所得内存中,会在其头部构造一个数据结构(它包含可用内存的起始地址、大小),并把这个结构链入某个链表

总之,关键的地方在于使用sbrk调用得到一块内存,然后在上面实现所谓的“堆”。

最后,楼主若觉得有用,就给我点分吧──我连在找分来参我的其他帖子加分呢。
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
为何要向内核申请内存?我觉得进程拥有所谓4G空间,其中哪一段地址用作堆内存应该是固定的。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
堆栈应该是由系统在程序起动时维护的吧。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
LZ是要自己来维护一个堆,还是要自己管理内存(无操作系统)?前者是向操作系统申请一块空间,然后自己管理在此空间内小块内存的分配和释放,由操作系统来处理内存页映射;后者则需要自己设计描述符表、页映射表,如果使用虚拟内存还要自己处理页故障。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表