https://mp.weixin.qq.com/s/c1koosWQ_NIUmye_etOsfw(部分)
一个用户进程可以访问的内存区域介于 0x0804 8000 到0xc0000000 之间
栈内存是用于存放环境变量、命令行参数和局部变量的。栈内存空间十分有限,默认情况下栈的大小为 8M ,在嵌入式开发的时候我们应该尽可能减少使用栈空间。栈空间的增长,从上(高地址) 往下 (低地址)每当有一个函数被调用的时候,栈就会从上往下分配一个段,这一段空间就是一个栈帧,该内存空间用来存放该函数的局部变量。当一个函数退出(调用结束)的时候,栈空间会从下往上释放一个栈帧,将所有的内存归还给系统。
注意:
栈空间中的内存存放的数据值是未知的, 因此每一个局部变量在使用之前最好做好初始化
栈内存的空间我们无法手动实现申请与释放,都是由系统自动完成,我们无法干预。
堆空间是相对自由的空间,这是一个非常重要的区域,因为在此区域定义的内存的 生命周期我们是可以控制的:从 malloc( )/calloc( )/realloc( )开始,到 free( )结束,其分配和释放完全由我们开发者自定义,这就给了我们最大的自由和灵活性,让程序在运行的过 程当中,以最大的效益使用内存。
注意:
相对于栈空间来说,堆的内存空间相对大很多
堆空间的增长方式,从下(低地址)往上(高地址)
堆空间中的内存都属于匿名空间, 因此需要借助指针来访问
有开发者自行申请和释放的,如果没有释放那么这个空间将一直存在,直到程序结束。
数据段中存放着全局变量、静态变量、和常量这些数据,生命周期与程序一致。程序不止,数据不断(段)。未初始化或者初始化为0的全局变量在BSS段。
代码段中又分成了两个空间:
.text段:存放用户的代码(mian func ...)
init段:当程序运行之初的一些初始化的工作(由编译器根据系统来对应添加的)