【c++】——进程虚拟地址空间

本文介绍了进程虚拟地址空间,包括实模式与保护模式的区别,重点解析了32位Linux系统中4GB虚拟内存的分配,如用户空间与内核空间的3:1比例划分,以及各区域如保留区、指令段、数据段、堆、栈等的详细内容。并说明了内核空间在不同进程间的共享特性。

1、引言

总所周知,任何的编程语言都会产生指令和数据。例如下面一段代码

#include<iostream>
#include<string.h>
using namespace std;

int gdata1 = 10;
int gdata2 = 0;
int gdata3;

static int gdata4 = 11;
static int gdata5 = 0;
static int gdata6;

int main()
{
	int a = 12;
	int b = 0;
	int c;

	static int e = 13;
	static int f = 0;
	static int g;

	return 0;
}

这段代码经过链接产生的可执行文件是在磁盘上的,通过cup将其加载到内存中。

【注意!不可能直接加载到物理内存上】
1、实模式
在早期8088CPU时期,采用实模式的方式,程序中用到的地址都是真实的物理地址,采用分段映射的方式直接将程序加载到物理内存中,如下图所示:
在这里插入图片描述
这种方式,可以使得恶意程序通过指针+偏移的方式访问物理地址中的所有程序会存在问题。

不可能直接加载到物理内存上。系统都会给当前进程开辟一个虚拟地址空间。

2、保护模式
基于实模式的缺点,在Intel 80386以后的X86系列处理器中为了保护操作系统就有了保护模式的概念,其只有通过虚拟内存映射才可以得到真正的物理地址。具体的过程如下:
在这里插入图片描述

2、进程虚拟地址空间大小

X86 32位linux系统中,linux系统会给当前进程分配一个==232==大小的一块空间(4G)虚拟地址空间分为:

  • 用户空间:应用程序可以使用的空间
  • 内核空间:只有操作系统才可以操作的空间,即运行内核代码。

Linux默认以3:1的比例分配;Windows默认以2:2划分,都可以自己改变。

关于虚拟的含义,我们可以这样来解释。
它存在,你能看得见,他是物理的。
它存在,你看不见,他是透明的。
他不存在,你却看得见,他是虚拟的
他不存在,你也看不见,他被删除了

3、4G虚拟内存空间分配情况

在这里插入图片描述
总体上来说,进程虚拟地址空间分为用户空间和内核空间两个部分,从上到下地址减小。接下来,我们来介绍相关区域的具体含义。

【用户空间】
1、保留区
128M大小,不可访问,不允许读写。主要存放C基本的库实现,由操作系统调用。任何普通程序对它的引用都是非法的,如下面一段代码:

char* p = nullptr;
strlen(p);
char* src = nullptr;
strcpy(dest,src)

p指向了一个不可访问区,我们从0地址打算拷贝一个字符串,但是程序运行直接崩溃,因为0地址空间是不可访问的。
故操作系统在加载程序的时候都是从0x08048000开始加载。

2、指令段【.text】存放指令,可读,可执行
3、数据段【.data】存放程序中已初始化且初始化不为0的全局变量或静态变量
4、数据段【.bss】存放未初始化或初始化为0的全局变量或静态变量,可读可写。
例如:

int gdata;
cout<<gdata<<end

以上代码我们会输出0,因为操作系统会把.bss里面的数据全部初始化为0

5、堆【.heap】
程序运行了过后调用new或者malloc才会分配堆内存(从低地址到高地址)

6、共享库【libc.so】
在堆栈之间存放库函数的定义点,因为现在只有库函数的声明,所以必须获取函数的定义点,这时候就需要共享库的存在。

7、栈【.stack】
所有函数的活动空间,局部变量,包含局部变量等,从上向下增长

8、命令行参数
保存传递给main函数的参数,如./main "hello"此时的“hello”为命令行参数

9、环境变量
通过环境变量可以变量可以设置库的路径

【内核空间】
1、内存直接访问区ZONE_DMA
16M,不需要经过CPU的寄存器,加快了磁盘和内存之间的数据交换
2、常用区ZONE_NORMAL
892M,内核中最重要的部分,存放页表,页面的映射,PCB就在这里
3、高端内存区ZONE_HIGHMEM
128M,存放大文件的映射,即内核中映射高于1GB的物理内存使用,64位操作系统没有该段。

4、具体空间指向

有了以上的基本概念过后,我们就可以针对本文开始呈现的那段代码来进行详细的解释其存放位置了。具体如下,其中指向的位置用相同的颜色标识
在这里插入图片描述
程序是由指令和数据构成的,局部变量属于指令,全局变量,静态全局变量,静态局部变量属于数据。
**【补充】
每一个进程的用户空间是私有的,但是内核空间是共享的
如下图所示,当我们有qq,酷狗和vs同时在线的时候,他们的进程虚拟地址空间如下:
在这里插入图片描述
每个进程的用户空间是相互隔离的,但是内核空间都是共享的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值