Memory layout

  • Text Segment

      Text Segment,通常也被称为代码段。

      为了防止 heap 或是 stack 的溢出,text 段常被安排在 heap 或是 stack 之后。

      Text 段通常是sharable 的, 所以对于使用频次比较高的程序,在内存中一般只有一份拷贝。另外,Text 段也常常只是 read-only 的,其目的是防止其中存放的指令被意外的修改。

  • Initialized Data Segment

      Initialized Data Segment 通常被称作数据段,这里存放着在源代码中已经被初始化的全局变量和静态变量。

      需要注意的是,数据段并不一定是 read-only 的,因为这里存放的变量,它们的值在程序运行期间是可以修改的。

      例如:

      char s[] = “hello world”;

      int debug = 1;

      int main (void)

      {

          return 0;

      }

      其中的 s 和 debug 变量是存放在 read-write 数据区。

      再看一个例子:

      char * string = “hello world”

      其中的 “hello world” 是存放于 read-only 数据区的,而指针变量 string 则是存放于 read-write 数据区。

  • Uninitialized Data Segment

      Uninitialized Data Segment,通常被称为 bss 段, 其名称来源于早期的表示 block started by symbol 的汇编操作符。在程序开始运行之前,由内核将存放于此数据段的数据初始化为0.

      在程序中被初始化为 0 的、以及未给出明确初始值的全局变量和静态变量,被放置于此。

  • Stack

      Stack 被翻译为,其中的数据遵循后入先出(LIFO)原则。

      局部变量,发生函数调用时 cpu 通用寄存器的值,被存储于栈中。

  • Heap

      Heap 的中文名称为,程序员动态 malloc/free 申请与释放的内存,即位于堆中。

 

      下面通过 size(1) 命令对以上内容进行验证。

1. 2017-09-06_16-04-20

 

2. 2017-09-07_13-18-56

 

3.2017-09-07_13-20-43

 

4.2017-09-07_13-22-42

5.2017-09-07_13-25-04

6.2017-09-07_13-26-53

 

7.2017-09-07_13-32-09

 

参考文献:

http://www.geeksforgeeks.org/memory-layout-of-c-program/

posted @ 2017-09-08 13:49  icuic  阅读(520)  评论(0编辑  收藏  举报