【操作系统基础】【CPU访存原理】:寄存 缓存 内存 外存、内存空间分区、虚拟地址转换、虚拟地址的映射

本文主要是介绍【操作系统基础】【CPU访存原理】:寄存 缓存 内存 外存、内存空间分区、虚拟地址转换、虚拟地址的映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

存储器怎么存储数据、内存空间分区、虚拟地址转换

计算机的存储器:寄存 缓存 内存 外存(按功能划分)

计算机的处理器需要一个存储器来存储大量的指令和数据以便自己不断取指执行和访问数据。

  1. 内存(内存就是运行内存,如手机的8G运行内存,电脑的16G运行内存)就是这个存储器。但是由于处理器访问内存需要的时间太长,而处理器处理指令的速度远大于从内存取指令的时间,
  2. 为了使取指令和执行指令的速度同步,在这两个硬件之间添加了高速缓存存储事先从内存调过来的指令以方便处理器更快取到指令。但是内存数据掉电就被清除。鲲鹏处理器采用经典的三级缓存结构:L1\L2\L3。
  3. 为长久保存数据和程序又增加了外存,当需要程序时把程序从外存中调到内存中再被处理器访问以执行,外存就是指电脑中的固态磁盘(Windows系统中的CDEF盘就是)或者机械硬盘(买的一小疙瘩硬盘)。
    在上述的存储器中,越靠近CPU的存储器被处理器访问的速度就越快,制造成本也就越高,容量也就越来越少。
    存储器硬件类型:让处理器可以访问到任何位置而不需要顺序地访问的 RAM(Random Access Memory)
  • 用作计算机高速缓存的SRAM。是双稳态存储,只要不掉电存储信息可以恒定保持。
  • 用作内存的DRAM,是电容存储信息,在不掉电情况下也需要时时给容易漏电的电容充电来保持数据。
处理器访问内存工作原理

事先准备:处理器通过总线连接到内存,总线有3种:地址总线传输要访问的地址;数据总线用来传输要交换的数据;控制总线传输处理器给内存的控制信号(读/写)。以读操作为例:

  1. 待访问的内存地址被处理器的寄存器保存着,再发送到地址总线;
  2. 处理器通过控制总线发送读命令;
  3. 内存根据地址总线的地址读出对应内存单元内容,再通过数据总线发送到处理器的寄存器中。
处理器上的虚拟地址转换为物理地址后发送给内存

在上述读操作中,处理器寄存器存储的地址一般是虚拟地址(逻辑地址),要在把虚拟地址发送到总线之前把虚拟地址转换成物理地址,内存管理单元MMU完成这个转换。这个内存管理单元硬件模块就在处理器当中。除转换地址,还可以进行访问权限的控制以及转址旁路缓存。
对地址转换过程进行配置的寄存器

  1. 控制内存管理单元MMU的使能的SCTLR
  2. 虚拟地址的位数和转换粒度(页大小)的TCR
  3. 存放页表基址(在地址转换中起到定位·页表的作用)的TTBR
    注:每一个异常级别都有一套独立的地址转换机制。
ARMv8架构支持的虚拟地址最大有多大,这么大怎么分区
  1. 最大支持48位虚拟地址、48位物理地址、可寻址256TB的地址空间。
  2. 虚拟地址被分为两个区域:内核空间和用户空间。这两个虚拟空间大小分别可以由TCR_EL1寄存器的T1SZ和T0SZ来配置。通常配置成相同大小。这两个的页表基址分别保存在页表基址寄存器TTBR1_EL1和TTBR0_EL1中。而物理内存大小也可以通过寄存器配置。
  3. 当两者空间大小一致(如T1SZ=T0SZ=39,即二者各有2**39=512G的地址空间),其分区如下:

虚拟空间布局以及地址转换

地址转换过程

内存管理单元MMU地址转换过程如下:

  1. CPU核发送虚拟地址给内存前被内存管理单元截获;
  2. MMU根据虚拟地址查询页表;
  3. 如果找到页表中有对应物理地址,用这个物理地址去访问内存;
  4. 没找到触发MMU异常Fault,硬件地把异常原因和该映射异常的虚拟地址分别保存在寄存器异常综合表征寄存器(ESR)和异常地址寄存器(FAR)当中。
虚拟地址的映射方式

在虚拟内存中,内存被划分为固定大小的页(或页面),通常是以4KB或者更大的大小(可以用TCR_EL1寄存器设置页面大小)进行划分。即每一页有多个虚拟地址,为了加速到物理地址的映射,把这些页分别划归到不同的表中,再把这些表划归到不同的块中,这被称为多级页表。此时用页表遍历单元负责多级页表中的地址转换,也加入了缓存模块TLB存储最近访问的映射关系。
映射关系的存储:通过描述符来存储映射关系。描述符都是64位,最开始的两位存储描述符种类,有块描述符、表描述符、页描述符。这些描述符里保存的信息主要包括:下一级的页表的基址、以及下一级页表的访问权限(如该异常等级下页表有没有权限读/写),其他信息如下一级页表是否保存在安全内存中、该页表是否第一次被访问、该页表是否被缓存。

这篇关于【操作系统基础】【CPU访存原理】:寄存 缓存 内存 外存、内存空间分区、虚拟地址转换、虚拟地址的映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642381

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码