前言
最近看了《深入理解计算机系统》,重温了许多操作系统和组原的知识。本篇博客主要介绍虚拟内存,让我们先从ELF-->进程引入。
ELF文件
对于每个程序,其在经历预处理、编译、汇编之后,都要经过链接器将其链接成一个单一的可执行文件。在现在Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下:
可以看到ELF涵盖了程序中的各种信息,加载器就是通过读取ELF文件中的数据和代码,将其从磁盘复制到内存中,生成相应的进程并跳转到第一条指令或入口点来运行该程序。
进程
进程地址空间如下图所示:
可以看到,只读代码和数据对应于elf文件的(.init,.text,.rodata),读写段对应于elf文件的(.data,.bss)。
问题来了,如果我们有很多个程序要运行,所需内存已经超过了我们物理内存的容量,此时该怎么处理呢?
其实,当程序运行时,如果内存空间足够大,操作系统会按分页机制,将程序调入内存中。否则,操作系统会分批将程序的部分内容调入内存,再通过磁盘上的虚拟内存来实现内存置换,达到按需加载的目的。
到这里对虚拟内存有一定的概念了,似乎其作用就是“虚拟地扩充我们的内存”。
虚拟内存
由以上我们引入虚拟内存。
什么是虚拟内存
为了更加有效地管理内存,操作系统对主存提出了一种抽象的概念:虚拟内存。其通过硬件+软件的支持,为进程提供了更大的、一致的和私有的地址空间。虚拟内存主要提供一下三个能力:
-
将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存;
-
它为每个进程提供