声明:各种图均来自网络,部分已标明出处,侵删

1.物理地址、虚拟地址、逻辑地址

为什么需要内存?
因为磁盘的读写速度太慢,我们需要一个读写速度相对快的存储介质,而内存的作用就是存储运算的数据,这些数据来自硬盘

1.1 物理地址和虚拟地址

多个程序要并发执行时,那这些程序的数据同时放到内存,我们该如何区分哪些数据属于哪个程序?
给内存的存储地址编地址(物理地址) ,也就是为某个存储单元进行编号,如果按字节编址意味着一个存储单元大小为一个字节

下图来自程序员cxuan

编好地址后将进程与这些物理地址映射起来,才能区分这些内存中存储的数据属于哪个进程,但内存大小是有限,而进程可以很多,所以我们不能将进程直接与物理地址直接映射起来,否则内存肯定不够这么多进程一起用,显然我们需要其他机制来实现让很多进程共用一个存储资源有限的内存,由此引出虚拟地址,我们先将进程与虚拟地址映射起来,再将虚拟地址与物理地址映射起来

下图来自小林coding

MMU为内存管理单元,有时也叫分页内存管理单元(PMMU),它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bank switching,尤其是在8位的系统上)–摘自:MMU

逻辑地址是虚拟地址的具体描述形式即 段号:段内偏移量

虚拟存储器:这不是任何实际的物理存储器,而是借助磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。
虚拟地址:用于指示虚拟存储器的地址,它是用逻辑地址指示的–摘自:物理地址、虚拟地址、逻辑地址

各种地址的关系
下图来自云端FFF

1.2 管理物理地址和虚拟地址之间关系的方式

1.2.1 内存分段

管理虚拟地址和物理地址之间关系的方式之一
下图来自小林coding

1.2.2 内存分页

管理虚拟地址和物理地址之间关系的方式之一
下图来自程序员cxuan

下图来自小林coding

1.3 地址转换功能(从逻辑地址转换到物理地址)

将程序装入内存的过程和方式

预处理, 展开头文件/宏替换/去掉注释/条件编译 (main .i)
编译, 检查语法,生成汇编 (main .s)
汇编, 汇编代码转换机器码 (main.o)
链接, 链接到一起生成可执行程序 a.out
摘自:程序的链接和装入

下图来自王道考研操作系统
管理虚拟地址和物理地址之间关系的方式之一

下图来自Hhhighway

将目标模块链接到装入模块有三种方式

1.静态链接
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行文件(装入模块)之后不再拆开
下图来自王道考研操作系统

2.装入时动态链接
将各目标模块装入内存时,边装入边链接
下图来自王道考研操作系统

3.运行时动态链接
在程序执行中需要该目标模块时,才对它进行链接。优点:便于修改和更新,便于实现对目标模块的共享

下图来自王道考研操作系统

将装入模块装入内存有三种方式(即实现逻辑地址到物理地址的转换)

  1. 绝对装入 (适用于单道程序)
    编译时产生绝对地址,即逻辑地址直接就是物理地址
    一次性将全部进程数据装入内存,装入后物理地址不在改变

  2. 可重定位装入 (静态重定位)
    装入时将逻辑地址转换为物理地址
    例如:逻辑地址为0~5000,内存中从10000开始有空闲区,则逻辑地址0-5000中每个地址均加10000获得物理地址.即逻辑地址加一个偏移,之后物理地址不在改变
    一次性将全部进程数据装入内存,装入后物理地址不在改变
    下图来自Hhhighway

  3. 动态运行时装入 (动态重定位)
    运行时将逻辑地址转换为物理地址,需设置重定位寄存器
    以重定位寄存器中的值作为物理地址的起点然后加上逻辑地址得到物理地址
    程序运行前只装入部分代码,运行期间根据需要动态申请分配内存
    下图来自Hhhighway

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐