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

本文涉及的产品
公网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从业者体验企业级架构的实战训练。
目录
相关文章
|
9天前
|
存储 消息中间件 缓存
Redis:内存数据存储与缓存系统的技术探索
**Redis 概述与最佳实践** Redis,全称Remote Dictionary Server,是流行的内存数据结构存储系统,常用于数据库、缓存和消息中介。它支持字符串、哈希、列表等数据结构,并具备持久化、主从复制、集群部署及发布/订阅功能。Redis适用于缓存系统、计数器、消息队列、分布式锁和实时系统等场景。最佳实践包括选择合适的数据结构、优化缓存策略、监控调优、主从复制与集群部署以及确保安全配置。
15 3
|
11天前
|
缓存 安全 前端开发
(转)浅谈tomcat优化(内存,并发,缓存,安全,网络,系统等)
(转)浅谈tomcat优化(内存,并发,缓存,安全,网络,系统等)
|
17天前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
19天前
|
缓存 算法 安全
深入理解操作系统内存管理:分页系统的优势与挑战
【5月更文挑战第31天】 在现代操作系统中,内存管理是核心功能之一。分页系统作为内存管理的一种流行技术,其设计哲学基于时间和空间的局部性原理,旨在提高内存利用率和系统性能。本文将探讨分页系统的关键优势及其面临的挑战,包括页面置换算法、内存碎片问题以及虚拟到物理地址转换的复杂性。通过对分页机制的深入分析,我们揭示了它在多任务处理环境中如何允许多个进程共享主存资源,并保证了操作系统的稳定性与高效性。
|
20天前
|
存储 缓存 算法
深入理解操作系统内存管理:从虚拟内存到物理内存
【5月更文挑战第30天】操作系统的心脏——内存管理,在系统性能和稳定性中扮演着关键角色。本文将深入探讨操作系统中的内存管理机制,特别是虚拟内存与物理内存之间的映射关系、分页机制以及内存分配策略。通过分析现代操作系统如何处理内存资源,我们可以更好地理解计算机系统的内部工作原理,并掌握提升系统性能的关键因素。
|
20天前
|
存储 C语言
C语言变量的内存地址深入探究
C语言变量的内存地址深入探究
34 0
|
21天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用深入理解操作系统内存管理:原理与实践
【5月更文挑战第28天】 随着人工智能技术的飞速发展,图像识别作为其重要分支之一,在多个领域展现出了广泛的应用潜力。尤其是在自动驾驶系统中,基于深度学习的图像识别技术已成为实现车辆环境感知和决策的关键。本文将深入探讨深度学习算法在自动驾驶图像识别中的作用,分析其面临的挑战以及未来的发展趋势,并以此为基础,展望该技术对自动驾驶安全性和效率的影响。
|
21天前
|
缓存 算法
深入理解操作系统内存管理:分页系统的优势与挑战
【5月更文挑战第28天】 在现代操作系统中,内存管理是一项至关重要的功能,它不仅确保了系统的稳定运行,还提升了资源的利用效率。本文将探讨分页系统这一核心概念,并分析其在内存管理中的优势和面临的挑战。通过剖析分页机制的工作原理及其对虚拟内存实现的重要性,我们进一步阐述了它在多任务处理和内存保护方面的作用。同时,文章也将讨论分页带来的性能开销、页面置换算法的设计以及它们如何影响系统的整体性能。
|
22天前
|
存储 缓存 算法
深入理解操作系统内存管理:分页系统的优势与挑战构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】 在现代计算机系统中,内存管理是操作系统的核心功能之一。分页系统作为一种内存管理技术,通过将物理内存划分为固定大小的单元——页面,为每个运行的程序提供独立的虚拟地址空间。这种机制不仅提高了内存的使用效率,还为多任务环境提供了必要的隔离性。然而,分页系统的实现也带来了一系列的挑战,包括页面置换算法的选择、内存抖动问题以及TLB(Translation Lookaside Buffer)的管理等。本文旨在探讨分页系统的原理、优势及其面临的挑战,并通过分析现有解决方案,提出可能的改进措施。
|
25天前
|
存储 Java 编译器
Java | 如何从内存解析的角度理解“数组名实质是一个地址”?
这篇文章讨论了Java内存的简化结构以及如何解析一维和二维数组的内存分配。在Java中,内存分为栈和堆,栈存储局部变量,堆存储通过`new`关键字创建的对象和数组。方法区包含静态域和常量池。文章通过示例代码解释了一维数组的创建过程,分为声明数组、分配空间和赋值三个步骤,并提供了内存解析图。接着,介绍了二维数组的内存解析,强调二维数组是“数组的数组”,其内存结构中,外层元素存储内层数组的地址。最后,文章提到了默认初始化方式对初始值的影响,并给出了相关测试代码。
24 0