摘要
为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的虚拟地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。
虚存中的地址映射一般都是从虚拟地址映射到物理地址。
第一章 地址映射的由来
1.1 为什么使用虚拟地址
在操作系统的发展过程中,虚拟地址的出现起到了十分重要的作用。前期操作系统中的地址基本都是直接使用物理地址,这就造成了以下几个问题:
(1)安全风险
每个进程都可以访问0-4G的任意的内存空间,这也就意味着任意一个进程都能够去读写系统相关内存区域,如果是一个木马病毒,那么他就能随意的修改内存空间,让设备直接瘫痪
(2)地址不确定
众所周知,编译完成后的程序是存放在硬盘上的,当运行的时候,需要将程序搬到内存当中去运行,如果直接使用物理地址的话,我们无法确定内存现在使用到哪里了,也就是说拷贝的实际内存地址每一次运行都是不确定的,比如:第一次执a.out时候,内存当中一个进程都没有运行,所以搬移到内存地址是0x00000000,但是第二次的时候,内存已经有10个进程在运行了,那执行a.out的时候,内存地址就不一定了
(3)效率低下
如果直接使用物理内存的话,一个进程就是作为一个整体(内存块)操作的,如果出现物理内存不够用的时候,我们一般的办法是将不常用的进程拷贝到磁盘的交换分区中,好腾出内存,但是如果是物理地址的话,就需要将整个进程一起拷走,这样,在内存和磁盘之间拷贝时间太长,效率较低。
综上所述,直接使用物理地址隐患较多,此时便提出了虚拟地址的概念。
1.2 虚拟地址
虚拟地址是Linux内核虚拟出来的地址,经由MMU内存管理单元映射到实际的物理地址。MMU是实际的管理内存的硬件。其具体内容和功能将在下面进行阐述。
第二章 地址映射的原理
2.1 虚拟地址空间
我们知道,使用虚拟地址之后,程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
还可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
进程可用的虚拟地址范围称为该进程的“虚拟地址空间”。每个用户模式进程都有其各自的专用虚拟地址空间。 对于 32 位进程,虚拟地址空间通常为 2 GB,范围从 0x00000000 至 0x7FFFFFFF。对于 64 位进程,虚拟地址空间为 8 TB,范围从 0x000’00000000 至 0x7FF’FFFFFFFF。一系列虚拟地址有时称为一系列“虚拟内存”。
图1:虚拟地址空间
2.2 原理
介绍完虚拟地址空间后,我们就可以大概讲解一下地址映射的具体内容。目前主要有两种地址映射方式:分页和分段
2.2.1 分段映射
分段机制就是把虚拟地址空间中的虚拟内存组织成一些长度可变的称为段的内存