深入理解计算机系统(CSAPP)
  • 本电子书信息
  • 出版信息
    • 出版者的话
    • 中文版序一
    • 中文版序二
    • 译者序
    • 前言
    • 关于作者
  • 第 1 章:计算机系统漫游
    • 1.1 信息就是位 + 上下文
    • 1.2 程序被其他程序翻译成不同的格式
    • 1.3 了解编译系统如何工作是大有益处的
    • 1.4 处理器读并解释储存在内存中的指令
    • 1.5 高速缓存至关重要
    • 1.6 存储设备形成层次结构
    • 1.7 操作系统管理硬件
    • 1.8 系统之间利用网络通信
    • 1.9 重要主题
    • 1.10 小结
  • 第一部分:程序结构和执行
    • 第 2 章:信息的表示和处理
      • 2.1 信息存储
      • 2.2 整数表示
      • 2.3 整数运算
      • 2.4 浮点数
      • 2.5 小结
      • 家庭作业
    • 第 3 章:程序的机器级表示
      • 3.1 历史观点
      • 3.2 程序编码
      • 3.3 数据格式
      • 3.4 访问信息
    • 第 4 章:处理器体系结构
    • 第 5 章:优化程序性能
    • 第 6 章:存储器层次结构
  • 第二部分:在系统上运行程序
    • 第 7 章:链接
      • 7.1 编译器驱动程序
      • 7.2 静态链接
      • 7.3 目标文件
      • 7.4 可重定位目标文件
      • 7.5 符号和符号表
      • 7.6 符号解析
      • 7.7 重定位
      • 7.8 可执行目标文件
      • 7.9 加载可执行目标文件
      • 7.10 动态链接共享库
      • 7.11 从应用程序中加载和链接共享库
      • 7.12 位置无关代码
      • 7.13 库打桩机制
      • 7.14 处理目标文件的工具
      • 7.15 小结
      • 家庭作业
    • 第 8 章:异常控制流
      • 8.1 异常
      • 8.2 进程
      • 8.3 系统调用错误处理
      • 8.4 进程控制
      • 8.5 信号
      • 8.6 非本地跳转
      • 8.7 操作进程的工具
      • 8.8 小结
      • 家庭作业
    • 第 9 章:虚拟内存
      • 9.1 物理和虚拟寻址
      • 9.2 地址空间
      • 9.3 虚拟内存作为缓存的工具
      • 9.4 虚拟内存作为内存管理的工具
      • 9.5 虚拟内存作为内存保护的工具
      • 9.6 地址翻译
      • 9.7 案例研究:Intel Core i7 / Linux 内存系统
      • 9.8 内存映射
      • 9.9 动态内存分配
      • 9.10 垃圾收集
      • 9.11 C 程序中常见的与内存有关的错误
      • 9.12 小结
      • 家庭作业
  • 第三部分:程序间的交互和通信
    • 第 10 章:系统级 I/O
      • 10.1 Unix I/O
      • 10.2 文件
      • 10.3 打开和关闭文件
      • 10.4 读和写文件
      • 10.5 用 RIO 包健壮地读写
      • 10.6 读取文件元数据
      • 10.7 读取目录内容
      • 10.8 共享文件
      • 10.9 I/O 重定向
      • 10.10 标准 I/O
      • 10.11 综合:我该使用哪些 I/O 函数?
      • 10.12 小结
      • 家庭作业
    • 第 11 章:网络编程
      • 11.1 客户端—服务器编程模型
      • 11.2 网络
      • 11.3 全球 IP 因特网
      • 11.4 套接字接口
      • 11.5 Web 服务器
      • 11.6 综合:TINY Web 服务器
      • 11.7 小结
      • 家庭作业
    • 第 12 章:并发编程
      • 12.1 基于进程的并发编程
      • 12.2 基于 I/O 多路复用的并发编程
      • 12.3 基于线程的并发编程
      • 12.4 多线程程序中的共享变量
      • 12.5 用信号量同步线程
      • 12.6 使用线程提高并行性
      • 12.7 其他并发问题
      • 12.8 小结
      • 家庭作业
  • 附录 A:错误处理
  • 参考文献
  • 实验
    • 实验总览
      • 常见问题
    • 实验 1:Data Lab
      • README(讲师版)
      • README(学生版)
      • Writeup
    • 实验 2:Bomb Lab
      • README(讲师版)
      • Writeup
    • 实验 3:Attack Lab
    • 实验 4:Architechture Lab
    • 实验 5:Cache Lab
    • 实验 6:Performance Lab
    • 实验 7:Shell Lab
    • 实验 8:Malloc Lab
    • 实验 9:Proxy Lab
由 GitBook 提供支持
在本页
  1. 第二部分:在系统上运行程序
  2. 第 9 章:虚拟内存

9.2 地址空间

地址空间(addressspace)是一个非负整数地址的有序集合:

{0,1,2,⋯ }\{0,1,2,\cdots\}{0,1,2,⋯}

如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间(linear address space)。为了简化讨论,我们总是假设使用的是线性地址空间。在一个带虚拟内存的系统中,CPU 从一个有 N=2n\small N=2^nN=2n 个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间(virtual addres sspace):

{0,1,2,⋯ ,N—1}\{0,1,2,\cdots,N—1\}{0,1,2,⋯,N—1}

一个地址空间的大小是由表示最大地址所需要的位数来描述的。例如,一个包含N=2n\small N=2^nN=2n个地址的虚拟地址空间就叫做一个 n 位地址空间。现代系统通常支持 32 位或者 64 位虚拟地址空间。

一个系统还有一个物理地址空间(physical address space),对应于系统中物理内存的 M 个字节:

{0,1,2,⋯ ,M—1}\{0,1,2,\cdots,M—1\}{0,1,2,⋯,M—1}

M 不要求是 2 的幕,但是为了简化讨论,我们假设M=2m\small M=2^mM=2m 。

地址空间的概念是很重要的,因为它清楚地区分了数据对象(字节)和它们的属性(地址)。一旦认识到了这种区别,那么我们就可以将其推广,允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间。这就是虚拟内存的基本思想。主存中的每字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

练习题 9.1

完成下面的表格,填写缺失的条目,并且用适当的整数取代每个问号。

利用下列单位:K=210\small\rm K=2^{10}K=210(kilo,千),M=220\small\rm M=2^{20}M=220(mega,兆,百万),G=230\small\rm G=2^{30}G=230(giga,千兆,十亿),T=240\small\rm T=2^{40}T=240(tera,万亿),P=250\small\rm P=2^{50}P=250(peta,千千兆),或E=260\small E = 2^{60}E=260(exa,千兆兆)。

虚拟地址位数(n)

虚拟地址数(N)

最大可能的虚拟地址

8

64

这道题让你对不同地址空间的大小有了些了解。曾几何时,一个 32 位地址空间看上去似乎是无法想象的大。但是,现在有些数据库和科学应用需要更大的地址空间,而且你会发现这种趋势会继续。在有生之年,你可能会抱怨个人电脑上那狭促的 64 位地址空间!

虚拟地址位数(n)

虚拟地址数(N)

最大可能的虚拟地址

8

16

32

48

64

上一页9.1 物理和虚拟寻址下一页9.3 虚拟内存作为缓存的工具

最后更新于4年前

2?=64K\small 2^? = 64\rm K2?=64K
232−1=?G−1\small \rm 2^{32}-1=? G-1232−1=?G−1
2?=256T\small \rm 2^? = 256 T2?=256T
28=256\small 2^8 = 25628=256
28−1=255\small 2^8 -1= 25528−1=255
216=64 K\small 2^{16} = 64~\rm K216=64 K
216−1=64 K−1\small 2^{16} -1= 64~\rm K -1216−1=64 K−1
232=4 G\small 2^{32} = 4~\rm G232=4 G
232−1=4 G−1\small 2^{32} -1 = 4~\rm G -1232−1=4 G−1
248=256 T\small \rm 2^{48} = 256~\rm T248=256 T
248−1=256 T−1\small \rm 2^{48} -1 = 256~\rm T -1248−1=256 T−1
264=16384 P\small \rm 2^{64} = 16384~\rm P264=16384 P
264−1=16384 P−1\small \rm 2^{64} -1 = 16384~\rm P-1264−1=16384 P−1