OpenEdv-开源电子网

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

关于单片机程序和PC程序的内存5个段区的疑问?

[复制链接]

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2017-11-27 22:54:10 | 显示全部楼层 |阅读模式
1金钱
在网上的一些c/c++文章中看的了说内存分5段。代码段+初始化数据段(data)+未初始化数据段(BSS)+堆+栈,然后想到keil编译单片机代码后好像显示的也是这么些东西。感觉坑定有的地方。我有以下两个理解不知对不对。
1.PC端执行exe文件时是不是吧整个文件数据都搬进一个向系统申请好的内存了,然后其中有代码段+初始化数据段(data)+未初始化数据段(BSS)+栈。再在程序执行过程中由程序向系统申请内存,这部分内存就是(大小不固定)。
2.单片机端执行程序只是将初始化数据段(data)+未初始化数据段(BSS)从flash搬到内存,然后堆和栈都是在内存中固定大小的。执行程序是到flash里取代码段的指令(也就是说指令不用加载在内存里,PC程序是将代码也加载到内存)。


最佳答案

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

基本上都正确,理解很到位。单片机和处理器执行程序的不同就在于此,前者是从flash、ROM区域执行程序,而后者是从内存RAM中执行程序。 补充一点,对于STM32也有可以从RAM区执行程序的功能,但是一般用于调试。 不过应当说,在单片机中“将初始化数据段(data)+未初始化数据段(BSS)从flash搬到内存”这么说不太合适。编译器生成的汇编程序代码中有一部分就是在进入函数之前就将初始化数据段该初始化的初始化,未初始化数据段所 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2017-11-27 22:54:11 | 显示全部楼层
基本上都正确,理解很到位。单片机和处理器执行程序的不同就在于此,前者是从flash、ROM区域执行程序,而后者是从内存RAM中执行程序。

补充一点,对于STM32也有可以从RAM区执行程序的功能,但是一般用于调试。

不过应当说,在单片机中“将初始化数据段(data)+未初始化数据段(BSS)从flash搬到内存”这么说不太合适。编译器生成的汇编程序代码中有一部分就是在进入函数之前就将初始化数据段该初始化的初始化,未初始化数据段所对应的内存空间保留。
十六进制带我飞。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-11-28 00:07:00 | 显示全部楼层
帮顶
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
 楼主| 发表于 2017-11-28 11:53:46 | 显示全部楼层
DreamWaterPro 发表于 2017-11-28 10:23
基本上都正确,理解很到位。单片机和处理器执行程序的不同就在于此,前者是从flash、ROM区域执行程序,而后 ...

哦,好的谢谢。。
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
 楼主| 发表于 2017-11-28 12:10:12 | 显示全部楼层
DreamWaterPro 发表于 2017-11-27 22:54
基本上都正确,理解很到位。单片机和处理器执行程序的不同就在于此,前者是从flash、ROM区域执行程序,而后 ...

还想问个问题,在PC端的 代码段+初始化数据段(data)+未初始化数据段(BSS)+堆+栈  这5个段的地址应该不是严格的从低到高吧,特别是堆区是后来申请的。这些内存是不是通过类似链表的手段让他们有前后关系,但在内存中不需要连续。
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2017-11-29 13:01:01 | 显示全部楼层
pdwdzz 发表于 2017-11-28 12:10
还想问个问题,在PC端的 代码段+初始化数据段(data)+未初始化数据段(BSS)+堆+栈  这5个段的地址应该不是 ...

可以参考这篇博客:

http://blog.csdn.net/benny5609/article/details/2217258

的确如你所说,堆区在大多数情况下是不连续的。至于其他部分,内存地址是不是由低到高,我觉得应该是和程序的编译器有关,没仔细研究过,我也不好妄下结论。
十六进制带我飞。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 13:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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