进程的虚拟地址空间内存划分和布局

本文详细介绍了进程的虚拟地址空间,包括保留区、代码段、数据段、BSS段、堆、内存映射段(共享库)、栈、命令行参数和环境变量以及内核空间。每个部分的作用和特性都进行了阐述,例如代码段存放已编译的机器代码,数据段和BSS段分别用于已初始化和未初始化的全局变量,堆则用于动态内存分配,而内存映射段常用于加载动态库。此外,还讨论了栈在存放局部变量时的后进先出特性以及内核空间的特性。
摘要由CSDN通过智能技术生成


那么何为虚拟呢

它存在,你能看的见,它是物理的
它存在,你看不见,它是透明的
它不存在,你却看得见,它是虚拟
它不存在,你也看不见,它被删除了

一.虚拟地址空间

虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,好像每个进程都在独占地使用主存。每个进程看到的存储器都是一致的,称之为虛拟地址空间。 地址空间就是每个进程所能访问的内存地址范围,是一段连续的虚拟内存空间。
在这里插入图片描述

0~3G的用户空间。从小到大依次为:保留区(受保护的地址)、代码段、数据段(.data段)、.bss段、堆空间、内存映射段、栈空间、命令行参数和环境变量

1.1保留区

保留区即为受保护的地址,大小为0~4K,位于虚拟地址空间的最低部分,未赋予物理地址(不会与内存地址相对应,因此其不会放任何内容)。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。

1.2代码段

.text 已编译程序的机器代码
.rodata 只读数据,比如printf语句中的格式串和开关语句的跳转表
代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。代码段通常属于只读,以防止其他程序意外地修改其指令。

1.3 .data

已初始化的全局和静态变量。数据段属于静态内存分配(静态存储区),可读可写。由于全局变量未初始化时,其默认值为0,因此值为0的全局变量位于.bbs段(不位于数据段)。局部变量在运行时被保存在栈中,既不出现在.data 也不出现在.bss 中

1.4 .bss

该段用于存放未初始化的全局变量和静态局部变量,包括值为0的全局变量。 数据段和.bbs段又称为全局数据区,前者初始化,后者未初始化。
在目标文件中这个节不占据实际的空间,它仅仅是一个占位符,运行时,在内存中分配这些变量,初始值为0。

1.5 .heap

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

1.6 内存映射段(共享库)

内核将硬盘文件的内容直接映射到内存, 任何应用程序都可通过Linux的mmap()系统调用请求这种映射。内存映射是一种方便高效的文件I/O方式, 因而被用于装载动态共享库。如C标准库函数(fread、fwrite、fopen等)和Linux系统I/O函数,它们都是动态库函数,其中C标准库函数都被封装在了/lib/libc.so库文件中,都是二进制文件。这些动态库函数都是与位置无关的代码,即每次被加载进入内存映射区时的位置都是不一样的,因此使用的是其本身的逻辑地址,经过变换成线性地址(虚拟地址),然后再映射到内存。而静态库不一样,由于静态库被链接到可执行文件中,因此其位于代码段,每次在地址空间中的位置都是固定的。

1.7 stack

用于存放局部变量(非静态局部变量,C语言称为自动变量),分配存储空间时从高到低。栈和堆都是后进先出的数据结构。

1.8 命令行参数和环境变量

前者用于存放命令行参数的内容:argc和argv。后者用于存放当前的环境变量,搜索头文件和搜索库文件的路径。在Linux中用env命令可以查看其值。

1.9 内核空间

对于内核空间,由于只有一个操作系统,内核空间主要是机器指令、操作系统内核的各个模块等,它们是公用的(用户空间是私有的),因此每个进程的映射方式一样。强调一点:每个进程用到或即将用到的数据才会调入内存,其余都在磁盘上。但是各个进程内核空间的进程控制块(进程描述符)映射的地点是不一样的,也是相互独立的。共用的模块才是一样的。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值