深入理解计算机系统-之-内存寻址(一)--存储管理机制(虚拟地址,线性地址,物理地址)

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:

物理地址(physical address)


用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。

这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。

所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。

分段机制与逻辑地址(logical address)


Intel为了兼容,将远古时代的段式内存管理方式保留了下来。

逻辑地址指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址。

Intel中段式管理中,对逻辑地址要求,“一个逻辑地址,是由一个段标识符加上一个指定段内相对地址的偏移量,表示为 [段标识符:段内偏移量]

用分段方法来分配和管理虚拟存储器。把任务的地址空间分成若干段,而每一段有自己的段名和段大小。任务所使用的每一个地址空间都抽象为段基址:段偏移的格式,极大的方便了程序的编写和调试。
段式管理是x86架构下的内存管理方式,一直延续到现在。x86架构主要厂家intel、威盛和AMD.就是运行windows xp的pc机使用的处理器。

操作系统有实模式和保护模式两种,比如以前使用单片机那就是实模式,申请的地址就是实际的物理地址,寻址空间有限。而保护模式可以扩展到4G的虚拟地址,所以现在的操作系统都是运行在保护模式下的。

在x86架构下的系统,必须先将段管理的逻辑地址转换为虚拟地址,再将虚拟地址转换为物理地址(如果打开了分页管理的话)。而arm架构是没有分段管理的,所以直接将虚拟地址转换为物理地址。

分页机制与线性地址(linear address)


线性地址(linear address)或也叫虚拟地址(virtual address),跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那么线性地址则对应了硬件页式内存的转换前地址。

用分页方法来分配和管理实存。即把整个主存分成大小相等的存储块,可装入作业的任何一页。
这样分配内存时,操作系统以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。

“页”,我们称之为物理页,或者是页框、页桢的。是分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与内存页是一一对应的。
1、分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。万里长征就从此长始了。
2、每一个活动的进程,因为都有其独立的对应的虚似内存(页目录也是唯一的),那么它也对应了一个独立的页目录地址。——运行一个进程,需要将它的页目录地址放到cr3寄存器中,将别个的保存下来。
3、每一个32位的线性地址被划分为三部份,面目录索引(10位):页表索引(10位):偏移(12位)
依据以下步骤进行转换:
1、从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);
2、根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。
3、根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;
4、将页的起始地址与线性地址中最后12位相加,得到最终我们想要的葫芦;

地址空间和地址转换


虚拟存储器由大小可变的存储块(段)构成。实模式下直接由段基址:段偏移来得到虚拟地址。而保护模式下,CPU采用称为段描述符的数据来描述段的地址,大小和属性信息以及使用情况。虚拟存储器的地址(逻辑地址)由指示描述符的段选择子和段内偏移两部分构成,这样的地址合成为虚拟地址空间。

例如,通过这种转换,80386支持的虚拟控件就达到64T字节。程序员编写程序时使用的存储地址空间是虚拟地址空间。因此我们可以认为有64T的存储空间可供使用。

显然,只有在物理存储器的程序才能够被执行,也只有物理存储器中的数据才可以被访问。因此,虚拟地址空间必须被映射到物理地址空间,二维的虚拟必须被转换成一维的物理地址。而由于物理地址空间远小于虚拟地址空间。所以只有虚拟地址空间的部分可以映射到物理地址空间。由于物理存储器的大小远小于物理地址的空间,所以只有上述部分中的部分才能真正映射到物理存储器。

每一个任务都有一个虚拟地址空间。为了避免多个并行任务的多个虚拟地址空间直接映射到同一物理地址空间,采用线性地址空间来隔离虚拟地址空间和物理地址空间。
线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对等。

因此将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址,CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。

这里写图片描述

通过描述符表和描述符,分段管理机制实现了虚拟地址到线性地址的映射。完成了把二维的虚拟地址转换为一维的线性地址。这一步总是存在的。

分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称为页。通过在线性地址空间的页和物理地址空间的页之间建立的映射表,分页管理机制实现了线性地址空间到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就直接等同于物理地址空间,线性地址直接等于物理地址。

分段管理机制所使用的可变大小的块,使分段管理机制比较适宜处理复杂系统的逻辑分段。存储块的大小可以根据适当的逻辑含义进行定义,而不用考虑可大小的页所强加的人为限制。每个段可作为独立的单位进行处理,以简化段的保护和共享。分页机制所使用的固定大小的块最适合管理物理存储器。无论是管理内存还是外存都同样有效,分页管理机制能够有效的支持虚拟存储器(虚拟内存)


转载:http://blog.csdn.net/gatieme/article/details/50646824

目录
相关文章
|
3月前
|
Linux
内存学习(五):物理内存组织
内存学习(五):物理内存组织
178 0
|
3月前
|
缓存
内存学习(三):物理地址空间
内存学习(三):物理地址空间
64 0
|
3月前
|
缓存 Linux C语言
Linux内存管理宏观篇(四)物理内存:物理内存管理区
Linux内存管理宏观篇(四)物理内存:物理内存管理区
55 1
|
3月前
|
存储 缓存 Unix
内存学习(一):物理地址空间内存概述
内存学习(一):物理地址空间内存概述
38 0
|
1月前
|
存储 算法 内存技术
深入理解操作系统内存管理:从虚拟内存到物理内存
【2月更文挑战第30天】 在现代计算机系统中,操作系统的内存管理是确保系统高效稳定运行的关键组成部分。本文将深入探讨操作系统内存管理的复杂世界,特别是虚拟内存和物理内存之间的关联与转换机制。通过分析分页系统的工作原理、虚拟地址空间的结构以及页面置换算法,文章旨在为读者提供一个清晰的框架,以理解内存管理在操作系统中的重要性和实现细节。
|
1月前
|
Python
Python中如何判断两个对象的内存地址是否一致?
Python中如何判断两个对象的内存地址是否一致?
17 0
|
1月前
|
存储 C语言
【C语言】深入理解取地址符&:与内存地址的联系
【C语言】深入理解取地址符&:与内存地址的联系
104 0
|
1月前
|
存储 缓存 Linux
|
2月前
|
SQL Java 数据库连接
Flink内存问题之超出物理内存如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
3月前
|
C语言 芯片
获取物理内存容量
获取物理内存容量
39 0

热门文章

最新文章