如何深入掌握CSAPP第九章中虚拟内存的原理与实现?

2026-05-22 12:250阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计9900个文字,预计阅读时间需要40分钟。

如何深入掌握CSAPP第九章中虚拟内存的原理与实现?

前言:ELF文件+对于每个程序,经历预处理器、编译器、汇编器之后,都需要经过链接器将其链接成一个单一的执行文件。在当前Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下所示:

前言:

ELF文件

对于每个程序,其在经历预处理、编译、汇编之后,都要经过链接器将其链接成一个单一的可执行文件。在现在Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下:

可以看到ELF涵盖了程序中的各种信息,加载器就是通过读取ELF文件中的数据和代码,将其从磁盘复制到内存中,生成相应的进程并跳转到第一条指令或入口点来运行该程序。

进程

进程地址空间如下图所示:

可以看到,只读代码和数据对应于elf文件的(.init,.text,.rodata),读写段对应于elf文件的(.data,.bss)。

问题来了,如果我们有很多个程序要运行,所需内存已经超过了我们物理内存的容量,此时该怎么处理呢?

其实,当程序运行时,如果内存空间足够大,操作系统会按分页机制,将程序调入内存中。否则,操作系统会分批将程序的部分内容调入内存,再通过磁盘上的虚拟内存来实现内存置换,达到按需加载的目的。

到这里对虚拟内存有一定的概念了,似乎其作用就是“虚拟地扩充我们的内存”。

虚拟内存

为了更加有效地管理内存,操作系统对主存提出了一种抽象的概念虚拟内存。其通过硬件+软件的支持,为进程提供了更大的、一致的和私有的地址空间。

阅读全文

本文共计9900个文字,预计阅读时间需要40分钟。

如何深入掌握CSAPP第九章中虚拟内存的原理与实现?

前言:ELF文件+对于每个程序,经历预处理器、编译器、汇编器之后,都需要经过链接器将其链接成一个单一的执行文件。在当前Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下所示:

前言:

ELF文件

对于每个程序,其在经历预处理、编译、汇编之后,都要经过链接器将其链接成一个单一的可执行文件。在现在Unix和x86-64 Linux系统上,其使用的可执行格式为ELF,如下:

可以看到ELF涵盖了程序中的各种信息,加载器就是通过读取ELF文件中的数据和代码,将其从磁盘复制到内存中,生成相应的进程并跳转到第一条指令或入口点来运行该程序。

进程

进程地址空间如下图所示:

可以看到,只读代码和数据对应于elf文件的(.init,.text,.rodata),读写段对应于elf文件的(.data,.bss)。

问题来了,如果我们有很多个程序要运行,所需内存已经超过了我们物理内存的容量,此时该怎么处理呢?

其实,当程序运行时,如果内存空间足够大,操作系统会按分页机制,将程序调入内存中。否则,操作系统会分批将程序的部分内容调入内存,再通过磁盘上的虚拟内存来实现内存置换,达到按需加载的目的。

到这里对虚拟内存有一定的概念了,似乎其作用就是“虚拟地扩充我们的内存”。

虚拟内存

为了更加有效地管理内存,操作系统对主存提出了一种抽象的概念虚拟内存。其通过硬件+软件的支持,为进程提供了更大的、一致的和私有的地址空间。

阅读全文