虚拟地址空间的深度剖析

1.为什么引用虚拟内存:

        当我们运行一个程序时,会将程序全部装入内存,然后运行。但是在运行时经常会出现一些问题:

(1)继承地址空间没有隔离,没有权限保护

         由于程序都是访问物理内存,所以一个进程可以修改其他进程的内存数据,甚至修改内核地址空间的数据,很不安全。

(2)内存使用的效率极低

         当内存空间不足时,要将其他程序暂时拷贝到硬盘,让后再将新的程序装入内存运行。由于大量的数据装入装出,内存的 效率就会十分的低下。

(3)程序运行的地址不明确

          因为内存地址都是随机分配的,所以程序运行的地址也是不确定的。

   存在这么多的问题那么我们如何将计算机有限的物理内存分配给多个程序使用呢?

    我们在这里加入了一个中间层,即使用一种间接的地址访问方法。我们把程序给出的地址看作是一种虚拟地址(这个地址空间是虚拟的,不是实际存在的),然后通过某些映射的方法,将这个虚拟地址转换成实际的物理地址。这就多个程序可以同时运行且各个程序之间能够访问的物理内存区域不重叠,也杜绝了程序直接操作地址的现象,同时也提高物理地址的使用效率。这种呈现出比实际拥有的地址空间大得多的内存我们叫做虚拟内存。

2.这是一个4G的物理内存空间

Linux内核把虚拟地址空间分为两部分:用户进程空间,内核进程空间。

如下图所示:

在缓存原理中,换入/换出的数据以块为最小单位。在内存管理时,页是地址空间的最小单位。
虚拟地址空间划分为多个固定大小的虚拟页(VP),物理地址空间(DRAM内存)划分为多个固定大小的物理页(PP),
虚拟页和物理页的大小是一样的,通常为4KB。

3.虚拟地址的工作原理

虚拟存储器是由硬件和操作系统自动实现存储信息调度和管理的。它的工作过程包括6个步骤:
①中央处理器访问主存的逻辑地址分解成组号a和组内地址b,并对组号a进行地址变换,即将逻辑组号a作为索引,查地址变换表,以确定该组信息是否存放在主存内。
②如该组号已在主存内,则转而执行④;如果该组号不在主存内,则检查主存中是否有空闲区,如果没有,便将某个暂时不用的组调出送往辅存,以便将这组信息调入主存。
③从辅存读出所要的组,并送到主存空闲区,然后将那个空闲的物理组号a和逻辑组号a登录在地址变换表中。
④从地址变换表读出与逻辑组号a对应的物理组号a。
⑤从物理组号a和组内字节地址b得到物理地址。
⑥根据物理地址从主存中存取必要的信息。

4.虚拟地址作用总结
()1)虚拟内存管理可以控制物理内存的访问权限 
         访问的虚拟页若没有读写权限,则触发一个保护异常,终止进程。
(2)虚拟内存让每个进程有独立的地址空间
         对于私有区域来说,当不同进程对该区域做修改时,会触发写时拷贝,为新进程维护私有的虚拟地址空间。
(3)VA到PA的映射会给分配和释放内存带来方便。
         物理内存不连续的地址,可映射到连续的虚拟内存地址。
(4)内存效率高
          使用了页面调度,不会造成大量的数据装入装出。

5:计算机输出步骤

例如在计算机中编译运行一个hello world.c程序,它会在很短的时间内输出一个”hello world”,但是计算机把其中的几个步骤隐藏了,并没有像我们展示,分别是:预编译-> .i、编译-> .s、汇编-> .o、连接、生成可执行文件-> .exe。

这几个步骤的详细工作为:

预编译:处理与编译指令(#define  #include #if #elif )、添加行号和文件表示、删除注释、#pragma

编译: 词法分析、语法分析、语义分析、代码优化

汇编:把指令翻译成二进制

链接:合并段和符号表、符号解析、分配地址和空间、符号重定位

生成可执行文件:建立虚拟地址空间到物理内存的映射(创建内核映射结构体)、创建页目录和页表、加载指令和数据、程序的入口地址写入PC寄存器。

 

猜你喜欢

转载自blog.csdn.net/qq_41321905/article/details/84258076