OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4268|回复: 8

内存管理和系统分配内存是否冲突

[复制链接]

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-11-18
在线时间
11 小时
发表于 2016-7-11 12:02:44 | 显示全部楼层 |阅读模式
5金钱

看了原子哥的内存管理实验我不禁有个疑惑:

系统给每个函数或者程序中的变量分配内存,还有我们自己定义的结构体都是需要内存的,系统是怎么给他们分配内存的,或者说分配到了什么地方,然后就是原子哥的内存管理实验,把全部的内存(单片机的和外扩的)都划分到了内存管理里面了,

这是不是会有冲突?覆盖?毕竟内存是绝对的!

请大神指点,或者如何解决这样可能发生的问题

最佳答案

查看完整内容[请看2#楼]

参考C语言的内存分配。抄一段下来: BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 •数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 •代码段:在采用段式内存管理的架构中 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-7-11 12:02:45 | 显示全部楼层
参考C语言的内存分配。抄一段下来:
BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
•数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
•代码段:在采用段式内存管理的架构中,代码段(text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

程序编译后生成的目标文件至少含有这三个段,这三个段的大致结构图如下所示:

其中.text即为代码段,为只读。.bss段包含程序中未初始化的全局变量和static变量。data段包含三个部分:heap(堆)、stack(栈)和静态数据区。
•堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
•栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

当程序在执行时动态分配空间(C中的malloc函数),所分配的空间就属于heap。其概念与数据结构中“堆”的概念不同。

stack段存放函数内部的变量、参数和返回地址,其在函数被调用时自动分配,访问方式就是标准栈中的LIFO方式。(因为函数的局部变量存放在此,因此其访问方式应该是栈指针加偏移的方式,否则若通过push、pop操作来访问相当麻烦)

data段中的静态数据区存放的是程序中已初始化的全局变量、静态变量和常量。


所以,malloc函数分配的空间在堆HEAP当中,而mymalloc函数是先定义了一个大数组(很大,但是看清楚哦,没有使用全部内存,如果发生重叠编译器会出现ERROR)作为待分配区来进行分配的。C编译器会管理这些内存,所以不必担心重叠,尽可大胆去用。
还有就是malloc容易造成内存碎片,所以少用为好。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-7-11 12:19:29 | 显示全部楼层
绝对不会冲突。内存管理实验都是定义了一个很大的数组,还有你代码中定义的什么结构体,数组这些东西在编译代码的时候编译器都已经给你分配好了。
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-7-11 13:25:28 | 显示全部楼层
zuozhongkai 发表于 2016-7-11 12:19
绝对不会冲突。内存管理实验都是定义了一个很大的数组,还有你代码中定义的什么结构体,数组这些东西在编译 ...

小弟也有个疑问,代码中有强制将数组的地址置于某个绝对地址,例如里面用到attribute...at()...
我也想知道,程序中的全局变量就一定不会使用到这块内存吗???
电子爱好者
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-11-18
在线时间
11 小时
 楼主| 发表于 2016-7-11 14:00:32 | 显示全部楼层
zuozhongkai 发表于 2016-7-11 12:19
绝对不会冲突。内存管理实验都是定义了一个很大的数组,还有你代码中定义的什么结构体,数组这些东西在编译 ...

你可能理解错我的意思了,我想说的是用这样的内存管理软件(malloc)定义了绝对地址,而且还把整个单片机的内存都涵盖在里面了,我要是定义了结构体,变量,或者全局变量,那么系统(keil软件)在编译时给他们指定的内存我想肯定会有重叠,不管是否重叠,我想知道该如何处理。我在使用malloc时怎么手动分配内存,以保证他们不会重叠。
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13197
金钱
13197
注册时间
2012-11-26
在线时间
3820 小时
发表于 2016-7-11 14:21:29 | 显示全部楼层
feifei130 发表于 2016-7-11 14:00
你可能理解错我的意思了,我想说的是用这样的内存管理软件(malloc)定义了绝对地址,而且还把整个单片机 ...

malloc是在已经定义的数组里进行分配的
学无止境
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-7-11 14:23:17 | 显示全部楼层
liuchang 发表于 2016-7-11 13:25
小弟也有个疑问,代码中有强制将数组的地址置于某个绝对地址,例如里面用到attribute...at()...
我也想 ...

编译器会自动管理,不必担心。即使发生重叠也会生成ERROR提示
回复

使用道具 举报

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-1-2
在线时间
27 小时
发表于 2017-4-22 18:57:18 | 显示全部楼层
1、没有使用全部SRAM,已经保留了系统的自留地内存,在你定义完这些配置后(包括已经指定了某些绝对地址的变量、数组),编译器会统一安排地址,互不影响
2、地址不会重叠,因为开始定义了一个大数组,在这个圈定的范围内用于做动态分配,在这里面随便折腾
回复

使用道具 举报

cadre 该用户已被删除
发表于 2017-5-2 13:51:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 20:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表