存储

这一篇主要讲讲ROM\RAM\Flash的一些零碎知识点,网上也能找到很多资料。

1、ROM

1.1 概述

只读存储器(Read-only memory, ROM),当然从广义上来讲,也有一些器件,例如Flash,EPROM等等,通过某种手段可以编程的,也属于ROM的范畴的。ROM一般用在一些程序的存储和数据的存储,这里程序多半是比较固定的程序(Firmware,固件,一种跟硬件强相关的程序,例如驱动等等),这里的数据多半是固化的表项,查找表等等不会怎么改变的表项。

1.2 基本原理

HDL设计中,对于小ROM,深度和位宽都不大,一般使用组合逻辑就可以做一个ROM。如果数据比较大,比如1K*4B这种,就换一种ROM,使用标准单元Mask ROM,来做存储,如下图所示。百度百科对MASK ROM的定义,是制造商为了要大量生产,事先制作一颗有原始数据的ROM或EPROM当作样本,然后再大量生产与样本一样的 ROM,这一种做为大量生产的ROM样本就是MASK ROM,而烧录在MASK ROM中的资料永远无法做修改。


1.3 分类

一种是真的写了就没法改的ROM;一种是可以写一次的ROM(one-time Programmable read-only memory),使用的高压反熔丝技术;一种是可擦出的能、能写多次的ROM(Erasable programmable read only memory),使用紫外线擦除;一种是电擦除的EEPROM(Electrically Erasable programmable read only memory,EEPROM),再到后来东芝搞的Flash。工业界第一种ROM和最后一种的Flash用的比较多。

2、Flash

1.1 原理

非遗失性的存储,是在ROM的基础上演进出来的。目前主流是NAND和NOR。模拟的团队来做flash。可以任意地址访问。对于连续地址读访问,NAND和NOR的带宽差距不大。NAND是存储块访问,NOR可以Byte访问。总的来说,NOR特点就是比较细的访问,基本启动程序放NOR中,稳定性和可靠性也稍微高一些;NAND访问数据块比较好,通常数据放NAND中,而且成本也较低。

图: NOR Flash的时序

ale: address lock enable;一般Flash不会直接集成到芯片中,如果集成在芯片外面,IO数量增加,NOR解决办法就是数据和地址复用,当ale为高的时候,addr上走的是地址,当ale为低且csn为低的时候,addr上走的是数据。
wen:write enable;用于指示读还是写。
rdy:对于芯片和FLash分离,因为是异步接口,所以使用rdy信号用来握手。对于MCU来讲,如果把小的NOR flash集成到芯片内部,就可以直接使用同步接口,也就是SRAM的接口。


图:NAND Flash时序

CLE:Chip Lock Enable;

可以看到NAND也是数据和地址线复用的。NAND可以大块的数据读写,多了些Command。NAND Flash在MCU中的比较少。Flash跟ROM和RAM不同,不想数字的可以直接用工具生成,这个需要模拟团队自己做。

3、RAM

1.1 基本概念

Static Random Access Memory,静态的,随机的访问。静态的,不用刷新,不像DRAM需要随时刷新,但是SRAM没有DRAM的集成度高,面积比较大。另外,速度和功耗比DRAM好一些。

图:存储一个bit的SRAM的结构

6个CMOS管子组成一个SRAM单元,Q1和Q3组成反相器,Q2和Q4组成反相器,两个反相器组成一个环路,这样,只要不掉电,这个逻辑环就不会变,跟触发器原理有点类似。Q5用于控制输入,Q6用于控制输出,两个管子相当于输入和输出的开关。

1.2 分类

single port SRAM:不会发生读写冲突,因为之后一个端口,要么读,要么写;尽量做到先写后读,或者初始化再度,否则读出来的数据有可能不对(原因是SRAM的软失效)。对于软失效,可以加一个ECC校验,例如寸10bir,其中2bit是校验位。

Two port SRAM:FOGA的读写冲突允许,但是ASIC不可以,在同一个时刻,读地址和写地址不要一样。FIFO一般是TP SRAM。

Dual port SRAM:也是两个端口A、B,可以A读B写,也可以A写B读,不在局限于只能谁读谁写。可靠性,面积和率都不是很好。

工程上,使用两个SRAM,做乒乓操作,实现TP SRAM的功能,一个读的时候,另外一个写。两个SRAM加起来面积可能比TP SRAM小一些。对于几百几K的bit位,直接用D触发器来存储比较好。

1.3 接口

SRAM有一个需要注意下,就是Redundancy接口,用于扩展SRAM的,在比较的大的memory中会用,例如cache,这个接口可选的。用法的话,举个例子这个就是说,当SRAM中有一块坏掉了,这个时候就在尾部在接一块SRAM存储,就把坏块的地址映射到新加的存储块中,这个时候就要用的Redundancy了。

1.4 时序

对于Single port SDRAM的时序,如下图:


读是在一个时钟周期完成,如果是连续写,红点处,write enable是可以一直拉低的;读的话,是要在下一个时刻才能采到数据,注意下。

本文转自:博客园 - yiwenbo,转载此文目的在于传递更多信息,版权归原作者所有。

围观 7

1 、存储器系统的层次架构

计算机系统的存储器被组织城一个 金字塔的层次结构。自上而下为:CPU 内部寄存器、芯片内部高速缓存(cache)、芯片外部高速缓存(SRAM、SDRAM、DRAM) 、主存储器(FLASH、EEPROM)、外部存储器(磁盘、光盘、CF 卡、SD 卡)和远程二级存储器(分布式文件系统 、WEB 服务器),6个层次的结构。上述设备从上而下,依次速度更慢、容量更大、访问频率更小,造价更便宜。

2、高速缓存 (cache)

(1)工作原理 :主要利用了程序的 局部性特点。地址映象是指把主存地址空间映象到 cache 的地址空间。地址变换是指当程序或数据已经装入到 cache 后,在实际运行过程中,把主存地址如何编程 cache 空间的地址。

常用的地址映象和地址变换的方式有:

A、直接映象和变换:速度快,造价低,但有局限性,不能充分利用 cache 的好处。
B、组相联地址映象和变换:速度稍慢但是命中率高。
C、全相联地址映象和变换:可以任意映射。
D、常用的 cache 替换算法:轮转法和随机替换算法。
  
(2)高速缓存的分类:

A、统一 cache 和独立的数据/指令 cache
B、写通 cache 和写回 cache
C、读操作分配 cache 和写操作分配 cache

3 、存储管理单元( MMU )

MMU 在 CPU 和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为 内存映射。

MMU 主要完成下面的工作:

A. 虚拟存储空间到物理空间的映射。
B. 存储器访问权限的控制。
C. 设置虚拟存储空间的缓冲特性。

嵌入式系统中常常采用 页式存储管理。为了管理这些页引入了页表的概念。页表是位于内存中的表,它的每一行对应虚拟存储空间的一个页,该行包含了该虚拟内存页对应的物
理内存页的地址、该页的访问权限和该页的缓冲特性等。从虚拟地址到物理地址的变换过程就是 查询页表的过程。由于页表存储在内存中的,整个查询过程需要付出很大的代价。根据程序局部性的特点,增加了一个小容量、高速度的存储部件来存放当前访问需要的地址变换条目,这个存储部件称为: 地址转换后备缓冲器 (TLB)。

当 CPU 访问内存时,首先在 TLB 中查找需要的地址变换条目,如果该条目不存在,CPU 再从内存中的页表中查询,并把相应的结果添加到 TLB 中,更新它的内容。嵌入式系统中虚拟存储空间到物理空间的映射以 内存块为单位进行。即虚拟存储空间中一块连续的存储空间被映射到物理存储空间中同样大小的一块连续存储空间。在页表和 TLB 中,每一个地址变换条目实际上记录了一个虚拟存储空间的内存块的基地址与物理存储空间相对应的一个内存块的基地址之间的对应关系。在 MMU 中实现虚拟地址到物理地址的映射是通过 两级页表来实现的。禁止 MMU 时,所有物理地址和虚拟地址相等,即使用 平板存储模式。

4 、内存保护

操作系统通常利用 U MMU 来实现操作系统内核与应用程序之间的隔离,以及应用程序与应用程序之间的隔离。

内存保护包含两个方面的内容:

A. 防止地址越界,每个应用程序都有自己独立的地址空间。
B. 防止越权操作,每个应用程序都有自己的访问权限。

5 、实模式与保护模式

在嵌入式系统中,常见的存储管理方案可以分为两大类: 实模式和 保护模式。

(1)实模式:内存的平面使用模式。特点有:

A. 不划分“系统空间”与“用户空间”,无须进行地址映射。
B. 操作系统与应用程序之间不再有物理的边界。
C. 系统中的“任务”或“进程”,实际上全是内核线程。

在实模式下, 内存布局可以分为5个段:

A. 代码段:包含操作系统和应用程序的所有代码。
B. 数据段:所有带有初始值的全局变量。
C. BSS 段:所有未带初始值的全局变量。
D. 堆空间:动态分配的内存空间。
E. 栈空间:保存上下文以及函数调用时的局部变量和形参。

在实模式存储管理方案下,主要的工作在于 堆空间的管理,即如何来管理空闲的堆空间、如何来分配内存、如何来回收内存等等。

(2)保护模式:处理器中必须有 U MMU 硬件并启用。特点有:

A. 系统内核和用户程序都有各自独立的地址空间。
B. 每个应用程序只能访问自己的地址空间,不能去破坏操作系统和其他应用程序的代码和数据。

6 、分区存储管理

为了实现多道程序系统而采用的最简单的内存管理。基本思路:把整个内存划分为两大区域,即系统区和用户区,然后再把用户区划分为若干个分区,每个任务占有其中的一个分区。这样,在内存当中就同时保留多个任务,让他们共享整个用户区,从而实现多个任务的并发运行。

分区存储管理又可以分为两类: 固定分区和 可变分区。

(1)固定分区:各个用户分区的个数、位置和大小一旦确定后,就固定不变,不能再修改。

优点:易于实现,系统开销较小。

缺点:内存利用率不高,分区总数固定。

(2)可变分区:动态创建,在装入一个程序时,系统将根据它的需求和内存空间的使用情况来决定是否分配。

优点:动态变化,非常灵活。

缺点:可能存在外碎片。

在实现可变存储管理技术的时候,需要考虑三个方面的问题:

A. 内存管理的数据结构
B. 内存的分配算法
C. 内存的回收算法

7 、地址映射

地址映射也叫地址重定位。逻辑地址和物理地址是完全不同的,不能用逻辑地址来直接访问内存单元。为了保证 CPU 在执行指令的时候,可以正确地访问内存单元,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。这个过程称为: 地址映射。地址映射由存储管理单元 MMU 来完成。

(1)地址映射主要有两种方式:静态地址映射和动态地址映射。

A、静态地址映射:当用户程序被装入内存时,直接对指令代码进行修改,一次性地实现逻辑地址到物理地址的转换。

B、动态地址映射:当用户程序被装入内存时,不对指令代码做任何修改,而是在程序的运行过程中,当它需要访问内存单元的时候,再来进行地址转换。在具体实现时,这项转换工作一般是由硬件的地址映射机制来完成的。通常设置一个 基地址寄存器 ,或者叫重定位寄存器。当一个任务被调度运行时,就把它所在分区的起始地址装入到整个寄存器中。然后 ,在程序运行的过程中,当需要访问某个内存单元时,硬件就会自动地将其中的逻辑地址加上基地址寄存器中的内容,从而得到实际的物理地址,并且按照这个物理地址区执行。这个基地址寄存器位于 MMU 的内部,整个地址映射过程是自动运行的。从理论上说,每访问一次内存都要进行一次地址映射。

8 、页式存储管理(重点)

(1)基本思路:把物理内存划分为许多固定大小的内存块,称为 物理页面;把逻辑地址空间也划分为大小相同的块,称为 逻辑页面。当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域,而是以页面为单位来进行分配的。对于一个大小为 N 的页面程序,需要有 N 个空闲的物理页面来把它装载。这些物理页面不一定是要连续的。在页式存储管理中需要解决三个问题:数据结构、内存分配与回收、地址映射。

数据结构有两个:页表和物理页面表。

A. 页表:给出了任务逻辑页面号和内存中物理页面号之间的对应关系。
B. 物理页面表:描述内存空间中,各个物理页面的使用情况。

内存的分配过程:

A. 对于一个新来的任务,计算它所需要的页面数 N,然后查看位示图,看是否还有 N 个空闲的物理页面。
B. 如果有足够的空闲物理页面,就去申请一个页表,其长度为 N,并把页表的起始地址填入到该任务的控制块中。
C. 分配 N 个空闲的物理页面,把他们的变换填到页表中,建立逻辑页面与物理页面直接的对应关系。
D. 修改位示图,对刚刚被占用的那些物理页面进行标记。

(2)地址映射的基本思路:

A. 逻辑地址分析:对逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址。
B. 页表查找:根据逻辑页面号,从页表中找出它对应的物理页面号。
C. 物理地址合成:根据物理页面号和页内偏移地址,最终确定物理地址。
  
(3)逻辑地址分析:

页面的大小都是2的整数次幂。对于给定的一个逻辑地址,可以直接把它的高位部分作为逻辑页面号 ,把它的低位部分作为页内偏移地址。例如,假设页面的大小是4KB,即2的12次幂,逻辑地址为32为,那么在一个逻辑地址当中,最低12位为页内偏移地址,而剩下的20位就是逻辑页面号。

计算方法:
逻辑页面号=逻辑地址/页面大小
页内偏移量=逻辑地址%页面大小

页表查找:
页表作为操作系统的一个数据结构,通常保存在内核的地址空间中。页表基地址寄存器用来指向页表的起始地址;页表长度寄存器用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。

物理地址合成:
假设物理页面号为 f,页内偏移地址为 offset,每个页面大小为2n ,那么相应的物理地址为: f×2n+offset。

9 、虚拟存储管理

(1)程序局部性原理: 时间局限性和 空间局限性。
(2)虚拟页式存储管理:在页式管理的基础上,增加了 请求调页和 页面置换的功能。

(3)基本思路 :当一个用户程序需要调入内存去运行时,不是将这个程序的所有页面都装入内存,而是只装载部分的页面,就可以启动这个程序运行。在运行过程中,如果发现要执行的指令或者访问的数据不在内存当中,就向系统发出缺页中断请求,然后系统在处理这个中断请求时,就会将保存在外存中的相应页面调入内存,从而使该程序能继续运行。在虚拟页式存储管理中,页表包含:逻辑页面号、物理页面号、驻留位、保护位、修改位和访问位。  

(4)常用的页面置换算法:

A. 最优页面置换算法:理想化算法。
B. 最近最久未使用算法:链表法和栈方法。寻找长时间没有被访问的页面。
C. 最不常用算法:每个页面设置一个访问计数器。
D. 先进先出算法:性能比较差。
E. 时钟页面置换算法:把页面组成环形链表,类似时钟面。

一般来说,当一个任务刚刚启动的时候,它会不断去访问一些新的页面,然后逐步建立一个比较稳定的工作集。 工作集是指当前任务正在使用的逻辑页面的集合。如果分配给一个任务的物理页面数太少,不能包含整个的工作集,任务将会造成很多缺页中断,需要频繁地进行页面置换,这种现象称为“ 抖动”。

转自: 沉舟侧畔

围观 486
订阅 RSS - 存储