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

本文涉及的产品
公网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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
3月前
|
存储 缓存 监控
|
2月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
230 48
|
1月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
57 3
|
1月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
1月前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
79 1
|
2月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
99 16
|
2月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
2月前
|
存储 算法 Java
Go语言的内存管理机制
【10月更文挑战第25天】Go语言的内存管理机制
44 2
|
2月前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
41 1
|
3月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
188 1