【linux--->虚拟地址空间】

前言


一、虚拟地址空间

1.高级语言中使用的地址

地址在高级编程语言中经常接触,但是语言中所使用的的地址其实是虚拟地址而不是物理地址。虚拟地址不等同于物理地址,下面一段C语言代码可以验证。
在这里插入图片描述
在这里插入图片描述
进程是具有独立性的,起初父进程和子进程又有相同的代码和数据,当子进程需要更改父进程的代码和数据的时候就会发生写时拷贝,从而子进程对数据的更改不会影响父进程的。但是这不是重点,重点是从这一段代码可以看出相同地址下存储的值是不一样的,如果这是物理地址的话,那么这是不符合常理的,所以我们在高级语言中使用的不是物理地址,而是虚拟地址。

2.物理地址编址原理

以32位计算机为例,物理连接上CPU和内存连接了32根地址总线,每一根线都能表示成0和1,32根就能表示2^32种不同的编码,每个不同的编码代表的是1个字节的物理单元,也就是说内存最大是4GB;编址方式按照16进制就是从全0到全f,按照十进制就是从0到42亿多;因为这个编码排布是线性是的所以说内存是线性的空间;
在这里插入图片描述

3.虚拟地址空间

虚拟内存其实就是物理内存抽象出来的一个内存空间,操作系统给每个进程都会分配一个虚拟内存空间,操作系统为了维护这些虚拟内存的结构体为struct mm_struct{},这个结构体中划分了不同的区域,就是编程语言中所说的堆栈代码段,常量区,静态区。在mm_struct结构体中定义了大量的start和end变量,来控制区域边界,这些start和end的值以及区域内的值就是虚拟地址;当进程申请的内存超出进程中mm_struct对象中的区域返回时,操作系统是会决绝请求的。
在这里插入图片描述

4.页表

不管我们使用的再怎么是虚拟空间,最终我们的代码和数据都是要存储到物理内存中去的,最终虚拟地址需要转化成为具体的物理内存空间来访问数据的。虚拟地址和物理内存之间存在着一种映射关系,这个关系由页表来维护。页表是虚拟地址想物理内存转化的一个工具,也是一层保护。创建一个变量,这个变量直接拿到的是虚拟地址,虚拟地址指向页表,由页表将将这个地址映射到具体的物理内存空间。

5.解释相同地址存储不同的值

子进程在创建之初是和父进程共享代码段和数据的,当子进程需要改动数据的时候,为了保持进程的独立性,父子进程互不影响,操作系统会重新分配一块物理内存给子进程将父进程对应的值拷贝一份烤新的物理内存中去,改变子进程中页表到物理内存value的指向,使其指向新的物理内存,但是不改变页表到虚拟内存的连接关系;如此这样就形成了相同地址不同的值的现象。
在这里插入图片描述

二、虚拟地址空间和页表的作用

1.进程与物理内存的解耦合

当我们使用一个物理内存空间时,只需要拿到虚拟地址,虚拟地址与页表建立连接,至于页表与物理内存如何连接,我们使用的是那一块物理内存不用关心;物理内存与页表也只需要维护页表与物理内存之间的关系即可,同样不用关心虚拟地址与页表的映射关系;这样页表的一边就纯粹是进程管理,另一边是内存管理,就完成了进程与物理内存的解耦合。
在这里插入图片描述

2.保护内存信息

如果没有虚拟内存和页表,进程的代码直接使用物理内存,比如当进程1已经在内存空间中存储了数据,进程2可能会发生越界访问将进程1的数据修改。有了虚拟内存和页表的存储就可以保护物理内存,当进程2发生越界访问,页表会检查访问的正确性,不是你的数据就会拒绝访问;C语言中还有常量,常量是只读的,定义一个常量的时候页表就可以将对应的地址标记为只读,当误操作要修改的时候页表会拒绝操作。
在这里插入图片描述

三、虚拟地址空间知识扩展

1.malloc空间分配规则

从语言中malloc以后操作系统不会马上分配空间,会等到使用空间的时候再分配,试想一下从预分配内到使用内存是有一段时间间隔的,这个一段时间内可能其他的进程也需要分配空间,如果所有进程都占着空间而不使用,空间的利用率会大大折扣。操作系统不允许任何的浪费和不高效的行为,所以申请空间的时候只是将虚拟地址返回,虚拟地址与页表建立了关系,但是页表与物理内存并没有建立连接,这叫做缺页中断。
在这里插入图片描述

2.可执行程序的编址

可执行程序在编译阶段其实就是已经编址好了的,使用objdump命令可以查看二进制代码的反汇编代码,其中就可可以看到编好的虚拟地址。也就是说可执行程序在没有加载到内存之前就已经编址了。
在这里插入图片描述
可执行程序在连接的时候会按照ELF链接格式将代码按照不同的段划分好,加载的时候会按照这些段加载到虚拟地址空间对应的不同区域。执行的时候,进程只需要找到程序执行接口找到第一条执行语句对应的虚拟空间映射的物理内存拿到代码执行即可,当函数调用的时候,调用的位置存储的函数的虚拟地址,通过调用位置的虚拟地址找到执行语句,通过执行语句拿到要调用函数的虚拟地址,跳转到函数的位置去执行函数即可。

在这里插入图片描述


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值