进程的虚拟地址空间分布

  一个linux进程的虚拟地址空间分布如上图所示,分为内核空间和进程空间,对于一个32位操作系统来说,4GB的空间分成两部分,低地址的0~3G给用户空间,高地址的3G~4G给内核空间。

内核空间

与进程有关的数据结构段

  每个进程都自己独特的PCB和页表,映射到不同的物理内存。

内核代码段

  所有进程的内核代码段都映射到同样的物理内存,并在内存中持续存在。

进程空间

1.正文段

  存放代码和常量值(字面值常量)

2.未初始化数据段(BSS段)

  存放未初始化的全局变量

3.初始化数据段

  存放已经初始化的全局变量

4.堆

  动态内存的分配

5.内存映射段

  常被用来加载共享库。

内存映射

  将虚拟内存空间与磁盘上的文件关联起来,来初始化这个虚拟内存空间的内容,这个过程叫内存映射。

共享库

1)几乎每个程序都会用到如printf之类的标准I/O函数,如果只使用静态库,这些函数的代码将会被复制到正文段中,对于一个运行上百个进程的系统来说,这是一种对内存的浪费,所以提出共享库

2)程序第一此执行时,用动态链接的方法将程序和共享库链接,减少了可执行文件的长度

6.栈

  存放局部变量

栈与堆的区别

转载自:https://blog.csdn.net/yusiguyuan/article/details/45155035?utm_source=blogxgwz0

原文地址:https://www.cnblogs.com/Joezzz/p/9803344.html

时间: 2024-08-02 07:42:35

进程的虚拟地址空间分布的相关文章

[memory]虚拟地址空间分布

一.开篇 踏入嵌入式软件行业也接近2年了,从研一开学起懵懵懂懂的开始学习C语言,由于本科时对这方面了解的少之又少,所以学起来比较困难,但是有一群无私奉献的小伙伴,慢慢的,慢慢的,慢慢的,一只脚踏进了嵌入式的大门. 看了很多本关于C语言学习的,我也是俗人一个,最初也是使用广为人知的那本"神书"--谭老的那本. 这些书中都无非是在讲一些C原因所谓的语法.规范等等,再加上PC端的封装的不能再封装的编译环境,抄一抄书本上的C代码,傻瓜式的点一点编译按钮,哇,竟然出现了"Hello W

进程的虚拟地址空间,堆栈、堆、数据段、代码段

上图是进程的虚拟地址空间示意图. 堆栈段: 1. 为函数内部的局部变量提供存储空间. 2. 进行函数调用时,存储“过程活动记录”. 3. 用作暂时存储区.如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈. 数据段(静态存储区): 包括BSS段的数据段,BSS段存储未初始化的全局变量.静态变量.数据段存储经过初始化的全局和静态变量. 代码段: 又称为文本段.存储可执行文件的指令. 堆: 就像堆栈段能够根据需要自动增长一样,数据段也有一个对象,用于完成这项工作,这就是堆(heap).堆区域用

进程地址空间分布和可执行文件分布

进程地址空间 操作系统在管理内存时,每个进程都有一个独立的进程地址空间,进程地址空间的地址为虚拟地址,对于32位操作系统,该虚拟地址空间为2^32=4GB. 进程在执行的时候,看到和使用的内存地址都是虚拟地址,而操作系统通过MMU部件将进程使用的虚拟地址转换为物理地址. 进程地址空间中分为各个不同的部分: (1)由于系统内核中有些代码.数据是所有进程所公用的,所以所有进程的进程地址空间中有一个专门的区域存放公共的内核代码和数据,该区域内的内容相同,且该虚拟内存映射到同一个物理内存区域. (2)进

Linux进程虚拟地址空间

在linux中,各个进程的虚拟地址空间是独立的.各个进程的虚拟地址空间起始于0,延伸至TASK_SIZE -1. 在32 bit系统中,内核分配1GB,而各个用户空间进程可用的部分为3GB. 进程虚拟地址空间由若干个区域组成, 1.当前运行代码的二进制代码.text段. 2.程序使用的动态库代码. 3.存储区局变量和静态变量的数据段,bss,data段 4.保存动态分配数据的堆 5.保存局部变量和实现函数 调用的栈 6.环境变量和命令行参数. 7.文件内容映射到虚拟地址空间的内存映射. 具体布局

LInux进程虚拟地址空间的管理

2017-04-07 脱离物理内存的管理,今天咱们来聊聊进程虚拟内存的管理.因为进程直接分配和使用的都是虚拟内存,而物理内存则是有系统"按需"分配给进程,在进程看来,只知道虚拟内存的存在! 前言: 关于虚拟内存和物理内存这些东东,本篇不作介绍,此等基础知识参考最普通的操作系统参考书籍即可.当然有问题也可留言,我们共同学习,共同进步! 进程虚拟地址空间: 每个进程拥有一个独立的虚拟地址空间,独立怎么体现?进程A有个地址1000,进程B也有个地址1000,为何两个地址不发生矛盾,还能正常工

虚拟地址空间

https://msdn.microsoft.com/zh-cn/library/hh439648(v=vs.85).aspx' 当处理器读或写入内存位置时,它会使用虚拟地址.作为读或写操作的一部分,处理器将虚拟地址转换为物理地址.通过虚拟地址访问内存有以下优势: 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区. 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区.当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件.数据或代码

虚拟内存和虚拟地址空间

虚拟地址空间: 1 每个进程拥有独立的进程地址空间,这个每个进程相互独立,不同进程不能访问其他进程的地址空间,否则会长生错误.一个进程的错误操作,也只会影响这个进程,不会导致其他进程的奔溃 2 实模式下的寻址方式,可以直接操作物理内存地址,但是不安全.任何进程都可以修改物理内存 3 每个进程的独立的地址空间,能够使得每个进程拥有独立的4g虚拟内存地址.共享一个物理内存. 4 虚拟内存,在磁盘中存在交换区,以解决虚拟内存地址大于物理内存的情况,通过换页机制,达到进程层面的内存扩容. 5/每个进程的

进程之进程控制块与虚拟地址空间

1.进程概念 在用户层面,进程是一次程序的动态运行实例, 在操作系统层面,进程是操作系统进行资源调度和分配的基本单位,每一个进程都有自己独立的地址空间和运行状态. 操作系统为进程创建了一系列的数据结构来管理进程.操作系统会为每个进程创建一个虚拟地址空间和进程控制块. 2.虚拟地址空间 在32位操作系统下,一个进程最多可以拥有4G的内存空间,在早期的计算机系统中,将程序直接加载到内存,也就是说, 程序所访问到的地址空间就是真实的内存空间,当有多个进程同时执行时,先将一个进程全部加载内存,然后,在剩

内存管理:虚拟地址空间以及编译模式

虚拟地址空间:就是程序可以使用的虚拟地址的有效范围.虚拟地址空间的大小由操作系统决定,但还会受到编译模式的影响. CPU的数据处理能力 地址总线:用于在内存上定位数据,例如:地址总线有20根,寻址能力为2^20 = 1MB 数据总线:位于主板之上,不在CPU中,用于在CPU和内存之间传输数据.决定了CPU单次的数据处理能力.(64位 = 寄存器的位数 = 数据总线的宽度) 主频:决定了CPU单位时间内的数据处理次数.(4GHz) 数据总线 × 主频 = CPU单位时间内的数据处理量. 实际支持的