社区
C语言
帖子详情
关于代码段,数据段和堆栈段
polarbear2008
2008-03-01 03:13:37
偶然看到这样一句话:
一个应用程序在运行时,它在内存中的映像可以分为三个部分: 代码段,
数据段和堆栈段.
请问下,是所有的程序都是这样吗?
cpu架构,编译原理,编译环境 哪一个和这个有关系呢?
程序的运行为什么一定要是这个样子?应该还有其他可能吧?
...全文
5133
25
打赏
收藏
关于代码段,数据段和堆栈段
偶然看到这样一句话: 一个应用程序在运行时,它在内存中的映像可以分为三个部分: 代码段, 数据段和堆栈段. 请问下,是所有的程序都是这样吗? cpu架构,编译原理,编译环境 哪一个和这个有关系呢? 程序的运行为什么一定要是这个样子?应该还有其他可能吧?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
YOU_ARE_MY_FAVORITE
2011-09-27
打赏
举报
回复
继续学习
lokyes
2011-08-29
打赏
举报
回复
[Quote=引用 15 楼 chlaws 的回复:]
简单说内存分堆栈.BBS段,数据段,文本段.
我建议你去看下C专家编程 P125
可执行文件的段在内存的布局.
[/Quote]这些说的都是静态的,一个exe文件放在那里,没有运行的时候就是这样的(这也是为什么编译后没有堆栈段的原因吧),要是在运行后呢,能詳細说说在运行时, cpu在代码段和堆栈段之间的使用吗,
现在比方说函数(大部分)应该都是在堆栈中运行的吧,但按理说函数编译后应该是属于代码段啊,这是为什么呢,求详解
magicyang87
2011-04-20
打赏
举报
回复
感觉应该是你的conn线程请求发完 等你的recv线程到那个时创建的套接字已经自己关闭了吧 是每次都到30个就不能再接收了?从conn到recv大约隔多长时间?
YOU_ARE_MY_FAVORITE
2011-01-02
打赏
举报
回复
路过,学习了。。。新年快乐!
primec
2009-07-29
打赏
举报
回复
学习
michney
2008-03-04
打赏
举报
回复
在冯诺依曼的体系结构中必须有:代码段,堆栈段,数据段
因为冯氏结构,本质就是取址,执行的过程
在非冯的体系结构中,可能就不受这个限制
baihacker
2008-03-04
打赏
举报
回复
来源: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被定义为:
polarbear2008
2008-03-04
打赏
举报
回复
请各位帮忙推荐几本书吧,这个问题应该是因为我不了解机器是如何理解程序的,是不是应该看一下机器语言相关的书籍。
CedarDiao
2008-03-02
打赏
举报
回复
看看这篇文章吧
http://hi.baidu.com/daihaipengdhp/blog/item/05d2b154d5079f1e3b29352c.html
ttlyfast
2008-03-01
打赏
举报
回复
代码94数据 数据亦是代码
chlaws
2008-03-01
打赏
举报
回复
简单说内存分堆栈.BBS段,数据段,文本段.
我建议你去看下C专家编程 P125
可执行文件的段在内存的布局.
polarbear2008
2008-03-01
打赏
举报
回复
[Quote=引用 12 楼 Kenmark 的回复:]
瞎掰
[/Quote]
正解是?
lyle3
2008-03-01
打赏
举报
回复
没见过~~
我啃
2008-03-01
打赏
举报
回复
瞎掰
cnzdgs
2008-03-01
打赏
举报
回复
有关“处理器结构”,我没看过相关的书,感觉在网上搜索一下看看基本上就明白了。顺便提一句,我觉得网上搜索比买书或者借书更方便快捷。
polarbear2008
2008-03-01
打赏
举报
回复
[Quote=引用 6 楼 ttlyfast 的回复:]
一个只有数据段的程序很好玩的
[/Quote]
愿听其详。。。
polarbear2008
2008-03-01
打赏
举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
LZ可以在网上搜索一下“处理器结构”。
[/Quote]
大虾能否推荐一本入门书籍?
这个问题我困惑了好久 :P
polarbear2008
2008-03-01
打赏
举报
回复
[Quote=引用 4 楼 wisdosoft 的回复:]
操作系统对于执行文件的格式和执行方式约定了exe文件形式。
[/Quote]
我觉得操作系统应该不是这个问题的关键,很多应用都是不带操作系统的。
ttlyfast
2008-03-01
打赏
举报
回复
凌乱是一种艺术 新版csdn真是XX界的一朵奇葩
ttlyfast
2008-03-01
打赏
举报
回复
一个只有数据段的程序很好玩的
加载更多回复(5)
ChatGPT自动生成
代码
+
数据
处理自动化实战
本课程试图让不会编程的你也能借助ChatGPT生成
代码
,轻松实现
数据
处理自动化,让你从小白秒变高手。懂编程的你也能收获良多,十倍提升工作效率。课程用ChatGPT自动生成
代码
,实现了
数据
处理自动化的绝大部分内容,包括
数据
导入和导出、
数据
整理、
数据
预处理、
数据
统计分析、
数据
可视化和与Excel工作表交互等。相关套餐:所属系列课程:Python+VBA办公自动化系列课程-CSDN程序员研修院。20+课程,不断增加和更新。 讲师:童大谦图书《代替VBA!用Python轻松实现Excel编程》和《对比VBA学Python 高xiao实现
数据
处理自动化》作者。 致力于Office和WPS Office办公自动化,提供VBA和Python全系列视频课程。熟悉Power BI, Python, R, SPSS, MATLAB等
数据
分析软件。有多年VB和.NET软件开发经验。
程序内存空间(
代码
段
、
数据
段
、
堆栈
段
)
在冯诺依曼的体系结构中必须有:
代码
段
,
堆栈
段
,
数据
段
。 进程的虚拟地址空间图示如下:
堆栈
段
: 1. 为函数内部的局部变量提供存储空间。 2. 进行函数调用时,存储“过程活动记录”。 3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入
堆栈
。
数据
段
(静态存储区): 包括BSS
段
的
数据
段
。BSS
段
存储未初始化的
汇编语言-实验10
代码
段
、
堆栈
段
和
数据
段
一、实验要求 1.请独立完成作业。 2.请使用debug调试程序,这样不但可以查看运行结果,还能检查程序问题。 3.思考题需要作答。 二、实验内容 1.设置
堆栈
段
存储
数据
,利用loop循环,使用单个字符输出的形式输出Hello world! 步骤要求: ①一种方法:设置独立的
堆栈
段
,存储字符串Hello world!(使用db还是dw呢?)。另一种方法:在实验9第3题基础上修改,保留
数据
段
的
数据
,增加
堆栈
段
;将
数据
段
数据
入栈。第二种方法有三个
段
——
数据
段
、
堆栈
段
和
代码
段
。 ②在
代码
段
中使用loop
代码
段
数据
段
堆栈
段
代码
段
数据
段
堆栈
段
段
寄存器中
代码
段
数据
段
堆栈
段
附加
段
段
寄存器中
代码
段
数据
段
堆栈
段
附加
段
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章