理解虚拟地址空间,进程与虚拟地址空间的关系

本文详细介绍了虚拟地址空间的概念,其通过mm_struct结构管理进程内存,利用页表解决地址映射。讨论了虚拟地址空间如何提高操作系统安全性和进程间隔离,并指出其在解决直接访问问题上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我将从以下几个方面进行介绍

1.什么是虚拟地址空间?

2.进程与虚拟地址空间的关系

3.为什么要有虚拟地址空间?

 

什么是虚拟地址空间?

虚拟地址空间的定义:

虚拟地址空间其实就是操作系统对每一个进程都认为自己独自占有占有内存的一种假象,用来存放虚拟地址。

虚拟地址空间的实现:

通过对链表,红黑树的相关操作实现虚拟地址内空间这样的一个形式。

7912e5b4c464454999db6e1b4ae38f0d.png

 

虚拟地址空间的图示如上;在代码层面上虚拟地址空间其实就是一个mm_struct这样的一个结构体,结构体里面就用无符号整型对代码区,数据区,堆区,栈区的起始地址和结束地址进行了存储从而划分出来各个区域;

5620665c8c06494bacd5e01b74209ad4.png

 

介绍一下页表:页表就类似于数的k/v结构,可以通过k值来访问v值。

 

有了对虚拟地址空间的基本了解,接下来就谈谈进程与虚拟地址空间的关系

操作系统用task_struct结构体对该文件的属性进行管理,mm_struct就是task_struct内的成员,当一个文件加载入到内存中时,就会创建task_struct结构体,将磁盘上文件的属性填充到该结构体里面,代码部分和数据这部分在加载到内存当中时会通过页表建立对应关系,将虚拟地址就填充到了mm_struct当中了。此时CPU就会从可执行程序的表头里获取enter(里面存放着该可执行程序的起始地址),当cpu读取到指令后就会到虚拟地址空间找到对应的虚拟地址,如果页表里有对应的映射,就通过页表映射就可以找到内存的物理地址,从而读取指令;如果页表里没有就会执行缺页中断,将这部分的代码和数据加载到内存当中,通过页表建立映射关系,反复如此进程就运行起来。

aedc63448704405097601ac69b9173aa.png

 

注:缺页中断是为了解决大型程序在内存一次性加载不下以及一次性加载时间过长的问题。

虚拟地址空间有什么优势?

在早期的计算机是采用直接访问的方式进行的,这样访问会存在以下问题:

1.当多个进程访问同一个数据时就会访问冲突了

2.没有进行访问检测,当一个程序指针越界访问时就可能访问到其他进程的数据,从而对其他进程产生影响,这是我们所不想看到

3.直接访问的不当操作还可能导致系统的效率降低

 

有了虚拟地址空间的话,我们就是通过虚拟地址映射物理地址这样的话就可以有以下优势:

1.当出现野指针的时候,可以在虚拟地址映射物理地址时检测出来,提高了操作系统的安全性

2.每个进程都有独立地虚拟地址空间,使得各个进程之间互不干扰,,相互独立

3.有了虚拟地址空间的话,系统就可以将进程加载到任意位置,不用关心内存的具体细节

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值