【操作系统基础】【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

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并