热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

程序空间(Programmemory)

Thecomputerprogrammemoryisorganizedintothefollowing:DataSegment(Data+BSS+Heap)StackCodes

The computer program memory is organized into the following:



  • Data Segment (Data + BSS + Heap)

  • Stack

  • Code segment

 


Dataclass="mw-editsection-bracket">

The data area contains global and static variables used by the program >that are explicitly initialized with a non-zero (or
non-NULL) value.
This segment can be further classified into a read-only
area and read-write area. For instance, the string defined by char
s[] = "hello world"
 in C and a C statement like int
debug=1
 outside the "main" would be stored in initialized read-write
area. And a C statement like const char* string = "hello
world"
 makes the string literal "hello
world"
 to be stored in initialized read-only area and the character
pointer variable string in initialized read-write area.
>Ex: both static
int i = 10
 and global int i = 10 will be
stored in the data segment.

data段包含程序使用的全局变量和静态变量(变量明确的使用非0或非NULL初始化).data段可以进一步的分类到read-only区和read-write区.

例如在C语言的"main"函数之外通过char s[] = "hello
world"定义的字符串 和 通过int debug=1声明的变量debug将会存储在初始化的read-write区。

类似const char* string = "hello
world"这样的声明,字符串"hello world"存储在初始化的read-only区,
指针变量string存储在read-write区.

 

 


BSSclass="mw-editsection-bracket">

The BSS segment, also known as uninitialized data, is
usually adjacent to the data segment and contains all global variables and
static variables that are initialized to zero or do not have explicit
initialization in source code. For instance a variable
declared static int i; would be contained in the BSS
segment.

>BSS段也被称为未初始化数据,它通常邻进data段,包含所有的全局变量和静态变量(>变量被初始化为0 或者 没有在代码中进行显示初始化).

例如使用static int
i;语句声明的变量i会被包含在BSS段.

 


Heapclass="mw-editsection-bracket">

The heap area commonly begins at the end of the .bss and .data segments and
grows to larger addresses from there. The heap area is managed by malloc,
realloc, and free, which may use the brk and sbrk system
calls to adjust its size (note that the use
of brk/sbrk and a single "heap area" is not required to fulfill the contract of
malloc/realloc/free;
they may also be implemented using mmap to
reserve potentially non-contiguous regions of virtual memory into the
process‘ virtual address space). The heap area is shared by all threads,
shared libraries, and dynamically loaded modules in a process.

Heap(堆)段通常在.bss段
和.data段的结尾处开始,并且开始向打的地址增长.

>Heap段是使用函数malloc\realloc\free等函数进行管理,这些函数可能会使用brk\sbrk系统调用调整Heap段的大小.

(需要注意的是 一个heap区
不是只能使用brk/sbrk来调整大小, 也可以使用mmap保留潜在的不连续区域的虚拟内存到进行的虚拟地址空间)

Heap段是一个进程中所有线程、共享库、动态加载的模块
所共享的。

 


Stackclass="mw-editsection">class="mw-editsection-bracket">


The stack area traditionally adjoined the heap area and they grew towards
each other; when the stack pointer met the heap pointer, free memory was
exhausted. With large address spaces and virtual memory techniques they tend to
be placed more freely, but they still typically grow in opposite directions. On
the standard PC x86 architecture the stack grows toward address zero,
meaning that more recent items, deeper in the call chain, are at numerically
lower addresses and closer to the heap. On some other architectures it grows the
opposite direction.

 >栈段包含了程序的栈,他是一个LIFO(后进先出)结构,通常位于内存较高的部分.一个栈指针寄存器保存着栈顶位置。

>每次有值压栈,栈指针寄存器就会进行调整。为了进行函数调用而压栈一组数值
这种方式叫做stack
frame(栈帧:栈帧也叫过程活动记录,是编译器用来实现函数调用的一种数据结构,从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。

>一个栈帧最少也会包含一个返回地址。自动变量也在堆上进行分配。

栈段习惯上邻接heap
段,他们向着对方的方向增长。当栈指针和堆指针相遇就意味着free memory耗尽了。

随着地址空间的增大和虚拟内存技术的出现,趋向于
更自由的安排 
堆 和 栈 的存放放置,但是他们还是向相反的方向增长。

>在标准x86结构的PC上,栈向0增长,意味着:越是新的项,在调用链中越深,地址越低,更靠近heap段。

>在其他结构中栈朝着相反的方向增长。

 

 


class="mw-headline" id="Stack">Code

In computing, a code segment, also known as
text segment or simply
as text, is one of the sections of a program in
an object file or in memory, which
contains executableinstructions.

It has a fixed size and is usually read-only. If the text section is not
read-only, then the particular architecture allows self-modifying
code. Fixed-position or position independent code may be shared in
memory by several processes in segmented or paged memory systems.

As a memory region, a code segment may be placed
below the heap or stack in order to prevent heap and stack
overflows from overwriting it.

>在电脑方面,code段也被称为text段,或者只是简单的称为text.

>code段是目标文件或内存中程序的其中一个section(节),其中包含了可执行的命令.

code段有固定的大小,并且通常是read-only的.

>如果code段不是read-only的,那么这个特殊的体系结构中允许self-modifying(自修改)代码.

固定位置的代码 或者 与位置无关的代码 可以在 段存储内存系统 和
页存储内存系统 中被几个进程共享.

 

 



//example.cpp

#include
<string.h> //for strcpy
#include //for malloc
int a = 0; //BSS
char *p1; //BSS
int b = 1; //Data
int main(void)
{
int c; //Stack
char s[] = "abc"; //Stack
char *p2; //Stack
char *p3 = "123456"; //123456‘\0‘ Data段,p3在Stack上。
static int d = 0; //BSS
p1 = (char *)malloc(10); //Heap
strcpy(p1, "123456"); //123456‘\0‘Data段,编译器可能会将它与p3所指向的"123456"优化成一个地方。

free(p1);
return 0;
}

 

---------------------------------------------------------------------------------------------------
参考资料:

http://bbs.csdn.net/topics/390737887

http://en.wikipedia.org/wiki/Data_segment

http://en.wikipedia.org/wiki/Code_segment

程序空间(Program memory),布布扣,bubuko.com


推荐阅读
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 在C#中,一旦对象被实例化后,直接重新调用构造函数是不可行的。与C++不同,C#不支持在对象实例化后强制调用构造函数。为了实现类似的功能,可以通过定义一个重置方法或使用工厂模式来重新初始化对象的状态。例如,可以创建一个 `Reset` 方法,在该方法中重新设置对象的属性和状态,从而达到类似于重新调用构造函数的效果。这样不仅保持了代码的清晰性和可维护性,还避免了潜在的副作用。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 基于试题数据的智能化管理平台采用Java语言进行面向对象编程,旨在构建一个高效的试题信息管理系统。该系统在JDK 6.0和MyEclipse 10.6环境下开发,通过优化试题数据管理和处理流程,提升系统的稳定性和用户体验。平台支持多用户操作,具备强大的数据处理能力和灵活的扩展性,适用于各类教育机构和考试组织。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
author-avatar
彬彬521521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有