每个进程所分配的内存由很多部分组成,通常称之为"段(segment)"。

文本段包含了进程运行的程序机器语言指令。文本段具有只读属性,以防止进程通过错误指针意外修改自身指令。

因为多个进程可同时运行同一程序,所以又将文本段设为可共享,这样,一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中。

初始化数据段包含显式初始化的全局变量和静态变量。当程序加载到内存时,从可执行文件中读取这些变量的值。

未初始化数据段包括了未进行显式初始化的全局变量和静态变量。

程序启动之前,系统将本段内所有内存初始化为0。

出于历史原因,此段常被称为BSS段,这源于老版本的汇编语言助记符"block started by symbol"。

将经过初始化的全局变量和静态变量与未经初始化的全局变量和静态变量分开存放,其主要原因在于程序在磁盘上存储时,没有必要为未经初始化的变量分配存储空间。

相反,可执行文件只需记录未初始化数据段的位置及所需大小,直到运行时再由程序加载器来分配这一空间。

栈(stack)是一个动态增长和收缩的段,由栈帧(stack frames)组成。

系统会为每个当前调用的函数分配一个栈帧。

栈帧中存储了函数的局部变量(所谓自动变量)、实参和返回值。

堆(heap)是可在运行时(为变量)动态进行内存分配的一块区域。

堆顶端称作program break。

对于初始化和未初始化的数据段而言,不太常用、但表述更清晰的称谓分别是用户初始化数据段(user-initialized data segment)和零初始化数据段(zero-initialized data segment)。

size命令可以显示二进制可执行文件的文本段、初始化数据段、非初始化数据段(bss)的段大小。

这里的的"段"不应该与一些硬件体系架构,比如x86-32中使用的硬件分段(segmentation)相混淆。

相反,这里的段指的是UNIX系统中进程虚拟内存的逻辑划分。有时,会用术语"区"(section)来代替段,因为在风行的可执行文件格式(ELF)规范中,采用的术语与"区"更趋一致。

下面的程序展示了不同类型的C语言变量,并以注释说明了每种变量分属于哪个段。

这些说明正确的前提是假定使用了非优化的编译器,且在应用程序二进制接口(ABI)中,是通过栈来传递所有参数的。实际上,优化编译器会将频繁使用的变量分配于寄存器中,或者索性地彻底将变量删除。

此外,一些ABI需要通过寄存器,而不是栈,来传递函数实参和结果。

但是这个例子只是意在展示C语言变量和进程各段之间的映射关系。

应用程序二进制接口(ABI)是一套规则,规定了二进制可执行文件 在运行时应该如何与某些服务(诸如内核或函数库所提供的服务)交换信息。ABI特别规定了使用哪些寄存器和栈地址来交换信息以及所交换值的含义,一旦针对某个特定的ABI进行了编译,其二进制可执行文件应能在ABI相同的任何系统上运行。与之相反,标准化的API仅能通过编译源代码来保证应用程序的可移植性。

虽然SUSv3没有规定,但在大多数UNIX实现(包括Linux)中C语言编程环境提供了3个全局符号(sysmbol):etext,edata和end,可在程序内使用这些符号以获取相应程序文本段、初始化数据和非初始化数据段结尾处下一字节的地址。

使用这些符号,必须显式声明如下:

extern char etext, edata, end;

下图展示了各种内存段在x86-32体系结构中的布局,该图的顶部标记为argv、environ的空间用来存储程序命令行实参(通过C语言中的main函数的argv参数获得)和进程环境列表(稍后讨论),图中十六进制的地址会因为内核配置和程序链接选项差异而有所不同。

图中标灰的区域表示这些范围在进程虚拟地址空间中不可用,也就是说,没有为这些区域创建页表(page table)。

Unix系统编程()进程内存布局的更多相关文章

  1. 《Linux/Unix系统编程手册》读书笔记3

    <Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...

  2. 《Linux/UNIX系统编程手册》读书笔记

    2018-1-30 一.UNIX.C语言以及Linux的历史回顾 1. UNIX简史.C语言的诞生 1969年,贝尔实验室的Ken Thompson首次实现了UNIX系统. 1973年,C语言步入成熟 ...

  3. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  4. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  5. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  6. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  7. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  8. 《Linux/Unix系统编程手册》 时间子系统

    Linux下操作系统编程有两本经典APUE即<Advanced Programming in the UNIX Environment>和TLPI<The Linux Program ...

  9. 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll

    关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...

随机推荐

  1. ECharts学习总结(三):ECharts图表对象的初始化(init)详解以及注意事项

    一.相关js文件的引入 这里我们采用标签式引入文件的方式,我们引入两个js文件,一个是esl.js文件和一个echarts.js. <script src="js/esl.js&quo ...

  2. Linux磁盘扩容

    Linux磁盘扩容 fdisk -l # 查看硬盘信息 lvextend -L +1G /dev/mapper/vg00-lvroot 或者 lvextend -l +%FREE /dev/mappe ...

  3. SQL2005 镜像配置

    新添加了一台服务器,做原来服务器的备份机,用交叉线+双网卡配置了内网. 系统环境:Windows 2008 R2 数据库:SQL2005 SP3   设置镜像可以用证书和域两种情况,不过域设置的权限比 ...

  4. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  5. 黑马程序员:多线程Socket

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ----------------------- 一.Socket一般应用模式(服 ...

  6. Box layout

    Layout management with layout classes is much more flexible and practical. It is the preferred way t ...

  7. ES6 import 循环加载

    1.示例 (1)a.js import {bar} from './b'; console.log('a.mjs'); console.log(bar); export let foo = 'foo' ...

  8. 视频编码格式转换 MP4

    视频工具有很多,如专业的premiere,但是我们只要涉及后期转换,不涉及制作,所以用不到这末专业的工具. 一般来说,使用暴风转码或者qq影音工具就足以应付我们的日常转换需求,下面以qq影音软件做说明 ...

  9. [转载]编写高性能js

    一.执行效率 1. DOM 1.1 使用DocumentFragment优化多次append 说明:添加多个dom元素时,先将元素append到DocumentFragment中,最后统一将Docum ...

  10. HTML 事件属性(如:onsubmit)

    学习啥都需要一个基础 基础很重要: HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript. 在现代浏览器中都内置有 ...