如何深入掌握CSAPP第九章中虚拟内存的原理与实现?
- 内容介绍
- 文章标签
- 相关推荐
本文共计9900个文字,预计阅读时间需要40分钟。
前言:ELF文件+对于每个程序,经历预处理器、编译器、汇编器之后,都需要经过链接器将其链接成一个单一的执行文件。在当前Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下所示:
前言:ELF文件
对于每个程序,其在经历预处理、编译、汇编之后,都要经过链接器将其链接成一个单一的可执行文件。在现在Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下:
可以看到ELF涵盖了程序中的各种信息,加载器就是通过读取ELF文件中的数据和代码,将其从磁盘复制到内存中,生成相应的进程并跳转到第一条指令或入口点来运行该程序。
进程
进程地址空间如下图所示:
可以看到,只读代码和数据对应于elf文件的(.init,.text,.rodata),读写段对应于elf文件的(.data,.bss)。
问题来了,如果我们有很多个程序要运行,所需内存已经超过了我们物理内存的容量,此时该怎么处理呢?
其实,当程序运行时,如果内存空间足够大,操作系统会按分页机制,将程序调入内存中。否则,操作系统会分批将程序的部分内容调入内存,再通过磁盘上的虚拟内存来实现内存置换,达到按需加载的目的。
到这里对虚拟内存有一定的概念了,似乎其作用就是“虚拟地扩充我们的内存”。
虚拟内存
为了更加有效地管理内存,操作系统对主存提出了一种抽象的概念:虚拟内存。其通过硬件+软件的支持,为进程提供了更大的、一致的和私有的地址空间。
本文共计9900个文字,预计阅读时间需要40分钟。
前言:ELF文件+对于每个程序,经历预处理器、编译器、汇编器之后,都需要经过链接器将其链接成一个单一的执行文件。在当前Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下所示:
前言:ELF文件
对于每个程序,其在经历预处理、编译、汇编之后,都要经过链接器将其链接成一个单一的可执行文件。在现在Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下:
可以看到ELF涵盖了程序中的各种信息,加载器就是通过读取ELF文件中的数据和代码,将其从磁盘复制到内存中,生成相应的进程并跳转到第一条指令或入口点来运行该程序。
进程
进程地址空间如下图所示:
可以看到,只读代码和数据对应于elf文件的(.init,.text,.rodata),读写段对应于elf文件的(.data,.bss)。
问题来了,如果我们有很多个程序要运行,所需内存已经超过了我们物理内存的容量,此时该怎么处理呢?
其实,当程序运行时,如果内存空间足够大,操作系统会按分页机制,将程序调入内存中。否则,操作系统会分批将程序的部分内容调入内存,再通过磁盘上的虚拟内存来实现内存置换,达到按需加载的目的。
到这里对虚拟内存有一定的概念了,似乎其作用就是“虚拟地扩充我们的内存”。
虚拟内存
为了更加有效地管理内存,操作系统对主存提出了一种抽象的概念:虚拟内存。其通过硬件+软件的支持,为进程提供了更大的、一致的和私有的地址空间。

