0%

虚拟地址空间

1. 概念

虚拟地址空间是指一个进程所使用的地址范围,但这些地址并不直接对应于物理内存中的位置,而是通过CPU中的内存管理单元MMU将虚拟地址空间映射到物理内存上。

虚拟地址空间的大小由操作系统决定,32位操作系统虚拟地址空间的大小为 2的32字节,也就是4G,64位的操作系统虚拟地址空间大小为2的64 字节。

当我们运行磁盘上一个可执行程序, 就会得到一个进程,内核会给每一个运行的进程创建一块属于自己的虚拟地址空间,并将应用程序数据装载到虚拟地址空间对应的地址上。

1.1 为什么使用虚拟内存

对于直接操纵物理内存的单片机来说,同时运行多个程序是不可能的。虚拟地址的存在是为了解决多程序并发执行时的内存管理和隔离问题,它带来了以下几个重要的好处和必要性:

  1. 内存隔离:虚拟地址允许每个进程拥有自己独立的地址空间,使得每个进程认为自己在使用整个系统的全部内存,从而实现了进程之间的内存隔离。这意味着一个进程无法直接访问另一个进程的内存,增强了系统的安全性和稳定性。
  2. 内存管理:通过虚拟地址空间,操作系统可以更灵活地管理内存,例如采用虚拟内存技术将部分数据存储在磁盘上,从而扩展可用内存大小。此外,还能使操作系统更容易地进行内存分配和释放,从而降低了内存管理的复杂性。

2. 虚拟地址到物理地址的映射

2.1 分页

页表是最常见的地址转换方式。虚拟地址被划分为固定大小的页(linux中每页为4KB),每个页都有对应的页表条目。页表记录了虚拟地址到物理地址的映射关系。当CPU发出一个内存访问请求时,MMU会根据页表将虚拟地址翻译成物理地址。

2.2 分段

虚拟地址被划分为逻辑段,每个逻辑段有对应的段描述符,记录了段的起始地址和长度等信息。CPU根据段描述符将虚拟地址转换成线性地址,然后再通过页表将线性地址映射到物理地址。