存储器怎么存储数据、内存空间分区、虚拟地址转换
计算机的存储器:寄存 缓存 内存 外存(按功能划分)
计算机的处理器需要一个存储器来存储大量的指令和数据以便自己不断取指执行和访问数据。
- 内存(内存就是运行内存,如手机的8G运行内存,电脑的16G运行内存)就是这个存储器。但是由于处理器访问内存需要的时间太长,而处理器处理指令的速度远大于从内存取指令的时间,
- 为了使取指令和执行指令的速度同步,在这两个硬件之间添加了高速缓存存储事先从内存调过来的指令以方便处理器更快取到指令。但是内存数据掉电就被清除。鲲鹏处理器采用经典的三级缓存结构:L1\L2\L3。
- 为长久保存数据和程序又增加了外存,当需要程序时把程序从外存中调到内存中再被处理器访问以执行,外存就是指电脑中的固态磁盘(Windows系统中的CDEF盘就是)或者机械硬盘(买的一小疙瘩硬盘)。
在上述的存储器中,越靠近CPU的存储器被处理器访问的速度就越快,制造成本也就越高,容量也就越来越少。
存储器硬件类型:让处理器可以访问到任何位置而不需要顺序地访问的 RAM(Random Access Memory)
- 用作计算机高速缓存的SRAM。是双稳态存储,只要不掉电存储信息可以恒定保持。
- 用作内存的DRAM,是电容存储信息,在不掉电情况下也需要时时给容易漏电的电容充电来保持数据。
处理器访问内存工作原理
事先准备:处理器通过总线连接到内存,总线有3种:地址总线传输要访问的地址;数据总线用来传输要交换的数据;控制总线传输处理器给内存的控制信号(读/写)。以读操作为例:
- 待访问的内存地址被处理器的寄存器保存着,再发送到地址总线;
- 处理器通过控制总线发送读命令;
- 内存根据地址总线的地址读出对应内存单元内容,再通过数据总线发送到处理器的寄存器中。
处理器上的虚拟地址转换为物理地址后发送给内存
在上述读操作中,处理器寄存器存储的地址一般是虚拟地址(逻辑地址),要在把虚拟地址发送到总线之前把虚拟地址转换成物理地址,内存管理单元MMU完成这个转换。这个内存管理单元硬件模块就在处理器当中。除转换地址,还可以进行访问权限的控制以及转址旁路缓存。
对地址转换过程进行配置的寄存器
- 控制内存管理单元MMU的使能的SCTLR。
- 虚拟地址的位数和转换粒度(页大小)的TCR。
- 存放页表基址(在地址转换中起到定位·页表的作用)的TTBR。
注:每一个异常级别都有一套独立的地址转换机制。
ARMv8架构支持的虚拟地址最大有多大,这么大怎么分区
- 最大支持48位虚拟地址、48位物理地址、可寻址256TB的地址空间。
- 虚拟地址被分为两个区域:内核空间和用户空间。这两个虚拟空间大小分别可以由TCR_EL1寄存器的T1SZ和T0SZ来配置。通常配置成相同大小。这两个的页表基址分别保存在页表基址寄存器TTBR1_EL1和TTBR0_EL1中。而物理内存大小也可以通过寄存器配置。
- 当两者空间大小一致(如T1SZ=T0SZ=39,即二者各有2**39=512G的地址空间),其分区如下:
地址转换过程
内存管理单元MMU地址转换过程如下:
- CPU核发送虚拟地址给内存前被内存管理单元截获;
- MMU根据虚拟地址查询页表;
- 如果找到页表中有对应物理地址,用这个物理地址去访问内存;
- 没找到触发MMU异常Fault,硬件地把异常原因和该映射异常的虚拟地址分别保存在寄存器异常综合表征寄存器(ESR)和异常地址寄存器(FAR)当中。
虚拟地址的映射方式
在虚拟内存中,内存被划分为固定大小的页(或页面),通常是以4KB或者更大的大小(可以用TCR_EL1寄存器设置页面大小)进行划分。即每一页有多个虚拟地址,为了加速到物理地址的映射,把这些页分别划归到不同的表中,再把这些表划归到不同的块中,这被称为多级页表。此时用页表遍历单元负责多级页表中的地址转换,也加入了缓存模块TLB存储最近访问的映射关系。
映射关系的存储:通过描述符来存储映射关系。描述符都是64位,最开始的两位存储描述符种类,有块描述符、表描述符、页描述符。这些描述符里保存的信息主要包括:下一级的页表的基址、以及下一级页表的访问权限(如该异常等级下页表有没有权限读/写),其他信息如下一级页表是否保存在安全内存中、该页表是否第一次被访问、该页表是否被缓存。