首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
C/C++
C语言
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
关于代码段,数据段和堆栈段
[已结贴,结贴人:polarbear2008]
加为好友
发送私信
在线聊天
polarbear2008
北极熊
等级:
发表于:
2008-03-01 15:13:37
楼主
偶然看到这样一句话:
一个应用程序在运行时,它在内存中的映像可以分为三个部分: 代码段,
数据段和堆栈段.
请问下,是所有的程序都是这样吗?
cpu架构,编译原理,编译环境 哪一个和这个有关系呢?
程序的运行为什么一定要是这个样子?应该还有其他可能吧?
问题点数:
20
回复次数:
20
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
henhaohenbaoli
阅读C99标准
等级:
发表于:
2008-03-01 15:23:30
1
楼 得分:
5
都有关系。目前为止没有其他可能
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
polarbear2008
北极熊
等级:
发表于:
2008-03-01 15:26:28
2
楼 得分:
0
如果是这样的话,那是什么因素制约了其他可能性呢?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wisdosoft
Flyfish
等级:
发表于:
2008-03-01 15:42:19
3
楼 得分:
0
以win32程序为例。
程序执行时,操作系统将exe文件映射入内存。exe文件格式为头数据和各段数据组成。头数据说明了exe文件的属性和执行环境,段数据又分为数据段,代码段,资源段等,段的多少和位置由头数据说明。也就是说,不仅仅只是代码段和数据段。这些段由不同的编译环境和编译参数控制,由编译器自动生成exe的段和文件格式。当操作系统执行exe时,会动态建立堆栈段,它是动态的,并且属于操作系统执行环境。
也就是说,程序在内存的映射一个为exe文件映射,包括数据段、代码段等它是不变的。
另一个为堆栈段,它是随程序运行动态改变的。
其他操作系统会有他自己的执行方式,但大体如上。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wisdosoft
Flyfish
等级:
发表于:
2008-03-01 15:45:20
4
楼 得分:
0
操作系统对于执行文件的格式和执行方式约定了exe文件形式。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cnzdgs
回贴亦是善举
等级:
发表于:
2008-03-01 15:46:12
5
楼 得分:
15
LZ可以在网上搜索一下“处理器结构”。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ttlyfast
催眠 。。师 。。。
等级:
发表于:
2008-03-01 15:48:18
6
楼 得分:
0
一个只有数据段的程序很好玩的
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ttlyfast
催眠 。。师 。。。
等级:
发表于:
2008-03-01 15:51:59
7
楼 得分:
0
凌乱是一种艺术 新版csdn真是XX界的一朵奇葩
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
polarbear2008
北极熊
等级:
发表于:
2008-03-01 16:08:20
8
楼 得分:
0
引用 4 楼 wisdosoft 的回复:
操作系统对于执行文件的格式和执行方式约定了exe文件形式。
我觉得操作系统应该不是这个问题的关键,很多应用都是不带操作系统的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
polarbear2008
北极熊
等级:
发表于:
2008-03-01 16:09:14
9
楼 得分:
0
引用 5 楼 cnzdgs 的回复:
LZ可以在网上搜索一下“处理器结构”。
大虾能否推荐一本入门书籍?
这个问题我困惑了好久 :P
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
polarbear2008
北极熊
等级:
发表于:
2008-03-01 16:10:45
10
楼 得分:
0
引用 6 楼 ttlyfast 的回复:
一个只有数据段的程序很好玩的
愿听其详。。。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cnzdgs
回贴亦是善举
等级:
发表于:
2008-03-01 16:17:47
11
楼 得分:
0
有关“处理器结构”,我没看过相关的书,感觉在网上搜索一下看看基本上就明白了。顺便提一句,我觉得网上搜索比买书或者借书更方便快捷。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Kenmark
<八音盒>
等级:
发表于:
2008-03-01 16:26:30
12
楼 得分:
0
瞎掰
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lyle3
小崔
等级:
发表于:
2008-03-01 16:45:29
13
楼 得分:
0
没见过~~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
polarbear2008
北极熊
等级:
发表于:
2008-03-01 17:07:12
14
楼 得分:
0
引用 12 楼 Kenmark 的回复:
瞎掰
正解是?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
chlaws
潇洒哥说-你是石家-
等级:
发表于:
2008-03-01 20:29:58
15
楼 得分:
0
简单说内存分堆栈.BBS段,数据段,文本段.
我建议你去看下C专家编程 P125
可执行文件的段在内存的布局.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ttlyfast
催眠 。。师 。。。
等级:
发表于:
2008-03-01 21:52:52
16
楼 得分:
0
代码94数据 数据亦是代码
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
codehat
老骥伏枥
等级:
发表于:
2008-03-02 18:59:34
17
楼 得分:
0
看看这篇文章吧
http://hi.baidu.com/daihaipengdhp/blog/item/05d2b154d5079f1e3b29352c.html
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
polarbear2008
北极熊
等级:
发表于:
2008-03-04 10:57:32
18
楼 得分:
0
请各位帮忙推荐几本书吧,这个问题应该是因为我不了解机器是如何理解程序的,是不是应该看一下机器语言相关的书籍。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
baihacker
飞雪
等级:
发表于:
2008-03-04 11:01:33
19
楼 得分:
0
来源:http://hi.baidu.com/feixue/blog/item/9658f3dee4a59f5094ee3753.html
(下面是部分内容)
预定义段
一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text、.bss、.rdata、.data、.rsrc、.edata、.idata、.pdata和.debug。一些应用程序不需要所有的这些段,同样还有一些应用程序为了自己特殊的需要而定义了更多的段。这种做法与MS-DOS和Windows 3.1中的代码段和数据段相似。事实上,应用程序定义一个独特的段的方法是使用标准编译器来指示对代码段和数据段的命名,或者使用名称段编译器选项-NT——就和Windows 3.1中应用程序定义独特的代码段和数据段一样。
以下是一个关于Windows NT PE文件之中一些有趣的公共段的讨论。
可执行代码段,.text
Windows 3.1和Windows NT之间的一个区别就是Windows NT默认的做法是将所有的代码段(正如它们在Windows 3.1中所提到的那样)组成了一个单独的段,名为“.text”。既然Windows NT使用了基于页面的虚拟内存管理系统,那么将分开的代码放入不同的段之中的做法就不太明智了。因此,拥有一个大的代码段对于操作系统和应用程序开发者来说,都是十分方便的。
.text段也包含了早先提到过的入口点。IAT亦存在于.text段之中的模块入口点之前。(IAT在.text段之中的存在非常有意义,因为这个表事实上是一系列的跳转指令,并且它们的跳转目标位置是已固定的地址。)当Windows NT的可执行映像装载入进程的地址空间时,IAT就和每一个导入函数的物理地址一同确定了。要在.text段之中查找IAT,装载器只用将模块的入口点定位,而IAT恰恰出现于入口点之前。既然每个入口拥有相同的尺寸,那么向后退查找这个表的起始位置就很容易了。
数据段,.bss、.rdata、.data
.bss段表示应用程序的未初始化数据,包括所有函数或源模块中声明为static的变量。
.rdata段表示只读的数据,比如字符串文字量、常量和调试目录信息。
所有其它变量(除了出现在栈上的自动变量)存储在.data段之中。基本上,这些是应用程序或模块的全局变量。
资源段,.rsrc
.rsrc段包含了模块的资源信息。它起始于一个资源目录结构,这个结构就像其它大多数结构一样,但是它的数据被更进一步地组织在了一棵资源树之中。以下的IMAGE_RESOURCE_DIRECTORY结构形成了这棵树的根和各个结点。
导出数据段,.edata
.edata段包含了应用程序或DLL的导出数据。在这个段出现的时候,它会包含一个到达导出信息的导出目录。
导入数据段,.idata
.idata段是导入数据,包括导入库和导入地址名称表。虽然定义了IMAGE_DIRECTORY_ENTRY_IMPORT,但是WINNT.H之中并无相应的导入目录结构。作为代替,其中有若干其它的结构,名为IMAGE_IMPORT_BY_NAME、IMAGE_THUNK_DATA与IMAGE_IMPORT_DESCRIPTOR。在我个人看来,我实在不知道这些结构是如何和.idata段发生关联的,所以我花了若干个小时来破译.idata段实体并且得到了一个更简单的结构,我名之为IMAGE_IMPORT_MODULE_DIRECTORY。
调试信息段,.debug
调试信息位于.debug段之中,同时PE文件格式也支持单独的调试文件(通常由.DBG扩展名标识)作为一种将调试信息集中的方法。调试段包含了调试信息,但是调试目录却位于早先提到的.rdata段之中。这其中每个目录都涉及了.debug段之中的调试信息。调试目录的结构IMAGE_DEBUG_DIRECTORY被定义为:
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
michney
奈良鹿丸
等级:
发表于:
2008-03-04 12:44:28
20
楼 得分:
0
在冯诺依曼的体系结构中必须有:代码段,堆栈段,数据段
因为冯氏结构,本质就是取址,执行的过程
在非冯的体系结构中,可能就不受这个限制
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友