从freeRTOS谈malloc内存是哪里来的?
来源:互联网 发布:网吧电影软件 编辑:程序博客网 时间:2024/04/28 01:56
简介:
malloc申请的内存是哪里来的呢?
很多人都说是从堆上来的。回答没错,可堆又是从哪里来的呢?本文结合freeRTOS嵌入式系统简单的介绍一下malloc内存的来历。
内容:
一句话先概括一下堆是从哪里来的,两种方式:
1:堆是编译器静态编译的确定的。
如果你定义了一个全局的数组,那么编译器编译是否要为这个数组分配空间呢?答案是肯定的。
如果有个嵌入式系统硬件上可用RAM只有175KB,编译freeRTOS,添加相关应用,生成了程序(即txt段,bss段,data段组合)。
假如查看map文件发现,.txt段,.bss段,.data段占用75k,还有100KB。这100KB干嘛用呢,一般剩余的内从作为系统的堆栈用。
如何才能作为系统的堆栈用呢?让操作系统来进行管理。
对于freeRTOS系统很简单,就是定义一个可配置的数组,让编译器为其分配内存。如下
/* Allocate the memory for the heap. */static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];把其作为系统的heap,进行初始化。其他所有内存都从这里获取。
于是有了malloc等相关的内存管理函数。系统中需要动态内存的都通过OS的内存管理
接口分配内存。甚至包含任务创建所需要的内存,如TCB,任务所需要的栈等。
2:堆是动态确定的。
编译器算出heap的起点。
pHeap=编译地址空间基地址(可以作为参数传递给编译器)+ (.txt段,.bss段,.data段等总和)。
然后系统使用这个指针不停的加。可参照brk的实现。
最后随便说点:
mmu的出现,可以说改变了编译器,编译器再也不用关心物理地址。将编译地址空间变为0g-4g(或者说无限大)。
对于linux一个进程,其首先载入elf文件,然后初始化task,堆栈指针初始化为
pStack=4g -(elf .txt段,.bss段,.data段等总和)。向上生长。
pHeap=4g 向下生长。
此时堆的本质已经变成了动态申请的虚存空间。
- 从freeRTOS谈malloc内存是哪里来的?
- SIGABRT 是从哪里来的
- 人的梦想是从哪里来的?
- request.getHeader("Referer")中的Referer是从哪里来的?
- 你觉得机会是从哪里来的呢
- malloc 从哪里得到的内存空间
- malloc 从哪里得到的内存空间
- (转)人的正确思想是从哪里来的?
- WordPress代码和分析-页面模板是从哪里来的
- WordPress代码和分析-页面模板是从哪里来的
- 这个是哪里来的呢?
- 强大的战斗力从哪里来!
- 你的工资从哪里来
- android里context从哪里来的????
- 漂亮的页面从哪里来?-CSS
- yum的变量从哪里来?
- PPT的设计灵感从哪里来?
- 孩子的小伙伴从哪里来?
- Android NDK JNI WARNING: illegal start byte 0x
- hdu1205
- ZOJ 3609 Modular Inverse 解线性模方程
- 物化视图
- linux系统移植之LCD驱动移植
- 从freeRTOS谈malloc内存是哪里来的?
- 栈对象,堆对象,对象指针
- 我喜欢阳光洒在脸上的感觉,因为这里有过太多的泪水
- AE内存图层
- Spotify称赶超苹果只是时间早晚的事
- Algorithm学习笔记 --- 单调队列
- python 用mysqldb方式操作数据库
- WIN7 SP1 0x8007000D错误
- poj1365