BSS段、数据段、代码段、堆与栈

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。

    BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。

    数据段属于静态内存分配。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区

    域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构

    也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量

    ,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩

       减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被

       扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义

      的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,

      在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的

      返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现

      场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

时间: 2024-08-01 10:44:58

BSS段、数据段、代码段、堆与栈的相关文章

VS2008中代码段(Snippet)及代码段编辑

网上资源零碎,主要是整理下. 整理的是主要核心内容,完整内容可以看后面标注的原文链接. 代码段是什么 <VS2008中代码段(Snippet)的功能> 在VS2008中,提供了代码段(Snippet)的功能.  什么是代码段呢?即使你对这个词还不是很熟悉,但是极有可能的是——你已经在不知不觉中应用它了.举例:   当我们在写一个选择分支(if语句)或是循环分支(for语句)时,难道要完全手动敲完每一个字符吗?当然不会这么笨,我们只要输入“if”然后再轻按两下Tab键,if语句的经典结构就跃然纸

LINUX下目标文件的BSS段、数据段、代码段

http://blog.chinaunix.net/uid-27018250-id-3867588.html bss 未初始化的全局数据 data 已经初始化的全局数据 text 代码段,机器指令 rodata 字符串常量 参考:<程序员自我修养> 代码编译后的机器指令经常被放在代码段里,代码段名为".text";已初始化的全局变量和已初始化的局部静态变量经常放在数据段里,数据段名为".data";未初始化的全局变量和未初始化局部静态变量一般放在“.bs

代码段中存放数据

1.前面我们写的程序中,只有一个代码段,我们先来在代码段中使用数据,看看和单独一个数据段存放数据有什么差别. 考虑这样一个问题,编程计算以下8个数据的和,结果存放在ax寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H 我们希望循环进行累加,所以要将数据存放在一个连续内存当中,如何将这些数据存储在一组地址连续的内存单元中呢?我们可以用指令一个一个将他们送入地址连续的内存单元,可是这样又存在一个问题,到哪里去找这段内存空间? 从规范的角度讲,

将数据、代码、栈放到不同的段(感觉很好)

1.将数据.栈都放到代码段中太混乱了.下面我们写一个程序,将数据.代码.栈放到不同的段中 assume cs:code,ds:data,ss:stack data segment dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mo

《80X86汇编语言程序设计教程》十一 32位代码段和16位代码段切换实例

1.  演示32位代码段与16位代码段之间的切换.实现的功能是以十六进制和ASCII码字符两种形式显示从内存地址100000H开始的16个字节的内容. 2.  源代码如下: 1 ;DosTest.Asm 2 ;16位偏移的段间转移指令的宏定义 3 ;使用于16位段,用于跳转到32位目的段 4 ;注意:标号偏移必须在16位二进制符号数数能表示的范围之内 5 JUMP16 macro selector,offsetv 6 db 0eah ;操作码 7 dw offsetv ;16位偏移 8 dw s

一致代码段和非一致代码段

最近在自己动手写操作系统,计算机其实是一个非常复杂的系统.其中包含了很多历史性的问题,让人感到生僻难懂.在CSDN上看到一篇关于一致代码段和非一致代码段的文章,非常好,收藏起来. 原文链接:http://blog.csdn.net/feijj2002_/article/details/4597174 之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全.不能被用户程序干涉.但是有时候用户程序也需要读取内核的某些数据,怎么办呢?操作系统就引入了访问特权等级(0-3)的机制.

【从头开始写操作系统系列】一致代码段与非一致代码段

上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构.在介绍这一跳转之前,这篇文章我们来介绍两个概念:一致代码段和非一致代码段. 首先,我们先来看几个问题: 一致代码段和非一致代码段是什么? 为什么要有一致代码段和非一致代码段? 系统提供怎样的机制来使用户程序访问内核数据? 程序如何在段与段之间跳转? 接下来,我们将讨论上述这些问题. 特权级 为了更好的理解之后的问题,我们先来讨论一个概念:特权级. 特权级是一种机制来

操作系统学习(十一) 、一致代码段和非一致代码段

一.概述 操作系统保护模式下把代码段分为一致代码段和非一致代码段的原因是:内核程序和用户程序要分开,内核程序不能被用户程序干扰.但是有时候用户程序也需要读取内核的某些数据,于是操作系统就从内核程序中分配一些可以供用户程序访问的段,但是不允许用户程序写入数据,用户程序访问这些段时遵循以下规则: 内核程序不知道用户程序的数据,不调用用户程序的数据,也不转移到用户程序中来 用户程序只能访问到内核的某些共享段,这些段称为一致代码段 用户程序不能访问内核不共享的段 二.一致代码段 一致代码段:简单理解就是

寄存器与代码段

汇编语言系列学习笔记: 汇编语言初探 寄存器与代码段(本文) 寄存器与数据段(待完成) 寄存器与栈段(待完成) 在上一篇博文中主要介绍了学习汇编语言的一些必备知识.其中和这篇文章联系比较紧密的是内存地址单元与 CPU 的概念,不熟悉的可以先行阅读上一篇博文. 在学习寄存器这两章内容的时候,首先要牢记一个观点:指令和数据在内存单元中没有任何区别,它们都是一些二进制信息. CPU 在读取内存中二进制信息的时候,将有的信息看作指令,有的信息看作数据. 在接下来的三篇博文中将具体介绍 CPU 到底是根据

VS中的代码段功能

1.前言 开发人员不喜欢打字.如果你希望提高开发人员的生产力,减少键入的数量,这也同时减少打字稿的数量以及因此产生的编译器错误,这些都极大分散了开发人员的注意力.代码重用是开发人员收集代码的另一个原因.即使单个应用程序也会大量地由小而公共的代码段组成,在几乎每个程序中都会有相同的代码元素:循环.类.异常处理等等.开发人员传统上是对代码进行剪切和粘贴以避免重复键入.但是这具有相当的局限性,包括有限的持久性,应该有更可行的解决方案. 这个解决方案就是在Visual Studio 2005中引入的代码