计算机体系结构/ 内存分层体系
- 计算机体系结构
- 内存分层体系
- 在操作系统的内存管理范例
内存金字塔
主存:对应 物理地址空间
进程:对应 逻辑地址空间
在操作系统中管理内存的不同方法
- 程序重定位
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
实现高度依赖于硬件
- 必须知道内存架构
- 硬件组件负责处理CPU的内存访问请求
地址空间&地址生成
地址空间定义
地址生成
逻辑地址是怎么生成的呢,如下图所示
- c程序中:变量以及函数的名字就是地址
- 汇编中:也是使用符号表示地址
- 机器语言(.o程序):起始地址从0开始的连续地址空间,是逻辑地址,符号名变成地址。
- 多个.o文件链接成可执行程序:把多个.o程序变成一个单一的可执行程序。地址上看已经做了全局的地址(从0开始)。目前是放在硬盘中的一个程序。
- 硬盘中的可执行程序使用一个程序lloader加载到内存中:完成该程序在内存中的逻辑地址的生成(地址加上偏移量)
逻辑地址和物理地址的转换
加载到内存的程序里面的地址是逻辑地址,那是如何转换为真实的物理地址的呢
- cpu和内存中都存在<逻辑地址-物理地址的>映射,cpu里面有缓存会更快
地址安全检查
基址寄存器与界限寄存器
使用一种简单的动态重定位,把每个进程的地址空间映射到物理内存的不同部分。当使用基址寄存器和界限寄存器时,程序装载到内存中连续的空闲位置且装载期间无须重定位,如图3-2c所示。当一个进程运行时,程序的起始物理地址装载到基址寄存器中,程序的长度装载到界限寄存器中。在图3-2c中,当第一个程序运行时,装载到这些硬件寄存器中的基址和界限值分别是0和16 384。当第二个程序运行时,这些值分别是16 384和16384。如果第三个16KB的程序被直接装载在第二个程序的地址之上并且运行,这时基址寄存器和界限寄存器里的值会是32 768和16 384。
每次一个进程访问内存,取一条指令,读或写一个数据字,CPU硬件会在把地址发送到内存总线前,自动把基址值加到进程发出的地址值上。同时,它检查程序提供的地址是否等于或大于界限寄存器里的值。如果访问的地址超过了界限,会产生错误并中止访问。这样,对图3-2c中第二个程序的第一条指令,程序执行