进程虚拟地址空间的简单总结

进程地址空间中分为各个不同的部分:
(1)由于系统内核中有些代码、数据是所有进程所公用的,所以所有进程的进程地址空间中有一个专门的区域存放公共的内核代码和数据,该区域内的内容相同,且该虚拟内存映射到同一个物理内存区域。
(2)进程在执行的时候,需要维护进程相关的数据结构,比如页表、task和mm结构、内核栈等,这些数据结构是进程独立的,各个进程之间可能不同。这些数据结构在进程虚拟地址空间中一个专门的区域中。
(3)进程在进行函数调用的时候,需要使用栈,于是进程地址空间中存在一个专门的虚拟内存区域维护用户栈。
(4)进程在进行动态内存分配的时候,需要使用堆,于是进程地址空间中存在一个专门的虚拟内存区域维护堆。
(5)进程中未初始化的数据在 .bss 段
(6)进程中初始化的数据在 .data 段
(7)进程代码在 .text 段
(8)进程执行的时候可能会调用共享库,在进程地址空间中有一个共享库的存储器映射区域,这个是进程独立的,因为每个进程可能调用不同的共享库。
linux系统中进程的地址空间分布如下图所示,其中在32位系统中0-3GB为用户空间,3-4GB为内核空间:
应用程序工作在用户空间
操作系统工作在内核空间

在这里插入图片描述
用户空间划分:1.0x08048000开始存放 2. text、rodata 3、data bss 4.heap 5.共享库(*.so)
6.stack 7.命令行参数 8.环境变量

内核空间

内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。

内核空间划分
1.ZONE_DMA(16M)
2.ZONE_NORMAL(896M).text .rodata.data.bss heap stack
3.ZONE_HIGHMEM(112M) 高端内存区域(内核空间地址映射采用线性映射,不同于用户空间基于二级页表映射,所以内核要映射1G以上的物理内存,需要借助ZONE_HIGHMEM)

所有进程的用户空间是私有的,内核空间是共享的
进程间的通信方式(匿名管道,命令管道,消息队列,共享内存,信号量)

32位Linux系统下,函数运行要分配栈(高 - 低)空间,系统默认的栈空间的大小是8M
所以最多创建线程pthread_create 3G / 8M = 384malloc/new heap(低 - 高)
栈又称堆栈,由编译器自动分配释放主要有三个用途:
1、为函数内部声明的非静态局部变量(C语言中称“自动变量”)提供存储空间
2、记录函数调用过程相关的维护性信息,称为栈帧(Stack Frame)或过程活动记录
3、临时存储区,用于暂存长算术表达式部分计算结果或alloca()函数分配的栈内内存

内存映射段mmp

该区域用于映射可执行文件用到的动态链接库。

堆用于存放进程运行时动态分配的内存段,可动态扩张或缩减。堆中内容是匿名的,不能按名字直接访问,只能通过指针间接访问。当进程调用malloc©/new(C++)等函数分配内存时,新分配的内存动态添加到堆上(扩张);当调用free©/delete(C++)等函数释放内存时,被释放的内存从堆中剔除(缩减) 。

bss段

BSS(Block Started by Symbol)段中通常存放程序中以下符号:

  • 未初始化的全局变量和静态局部变量
  • 初始值为0的全局变量和静态局部变量(依赖于编译器实现)
  • 未定义且初值不为0的符号(该初值即common block的大小)

数据段

数据段通常用于存放程序中已初始化且初值不为0的全局变量和静态局部变量。数据段属于静态内存分配(静态存储区),可读可写

代码段

代码段也称正文段或文本段,通常用于存放程序执行代码

保留区

位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。它并不是一个单一的内存区域,而是对地址空间中受到操作系统保护而禁止用户进程访问的地址区域的总称。

虚拟内存

一种现代操作系统(windows和linux)内存管理方式

  1. 给系统创建的每一个进程提供特定大小的虚拟地址空间
  2. 保证了所有进程地址空间-用户空间部分是隔离的,不能互相访问
  3. 当物理内存不够使用的情况下,缺页异常处理程序再分配物理页面,内核就会根据LRU算法,把闲置的物理页面(脏页),写入到磁盘的swap交换分区当中,然后再进行物理页面分配
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值