EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

嵌入式系统概论-04-存储架构

本文主要内容来自 SpriCoder的博客,更换了更清晰的图片并对原文的疏漏做了补充和修正。

内存

  1. 内存不断增长
  2. PC 从 16K 开始,最大 640K、当前的 4G 规范
  3. 地址总线的大小?32 位不足、64 位是可以的、128 位有点浪费

什么是内存?

硬件工程师的角度

Memory is a chip in which you can keep bits of data. There are really two kinds: ROM and RAM. These, in turn, come in two varieties each. There is masked programmed ROM and programmable devices, which you can program yourself. RAM may be static, which is easy to use, but has less capacity; dynamic is denser, but needs support circuits.

内存是一种可以保留数据比特的芯片,实际上有两种:ROM 和 RAM。这些依次又分为两种。有屏蔽的已编程 ROM 和可编程设备,您可以自己编程。 RAM 可能是静态的,易于使用,但容量较小;动态更密集,但需要支持电路。

软件工程师的角度

Memory is where you run your program. The code and data are read off of the disk into memory, and the program executed. You do not need to worry too much about the size, as virtual memory is effectively unlimited.

内存是您运行程序的地方。将代码和数据从磁盘上读取到内存中,并执行程序。您不必太担心大小,因为虚拟内存实际上是无限的。

嵌入式工程师的角度

Memory comes in two varieties: ROM, where you keep code and constants, and RAM, where you keep the variable data [but which contains garbage on startup].

内存分为两种:ROM,用于保存代码和常量;以及 RAM,用于保存变量数据(但其中包含启动时的垃圾)。

C 编译器的角度

There are lots of kinds of memory: there is some for code, variable data, literals, string constants, initialized statics, uninitialized statics, stack, heap, some is really I/ O devices, and so forth.

内存的种类很多:代码,变量数据,文字,字符串常量,初始化的静态变量,未初始化的静态变量,堆栈,堆,一些真正的 I/O 设备等等。

可固化代码 ROMable Code

  1. 代码将从 ROM 正确执行:无需复制到 RAM,但是 RAM 会快一些
  2. 代码和数据是不可以混合的:期待是静态的数据
  3. 编译器/链接器应符合这些要求:相对比较高
  4. XIP: eXecute In Place

内存组件

几种不同类型的内存:DRAM、SRAM、Flash、MRAM(磁读 RAM,物联网推动发展)、PCRAM、ReRAM

每种类型的内存都各不相同:容量、带宽(下图中的 Memory array 中的 :thumb 指令,传递次数)

随机存取存储器 RAM

  • 动态 RAM(DRAM)密集,需要刷新。
    1. 同步 DRAM(SDRAM)是主要类型。
    2. SDRAM 使用时钟来提高性能,以流水线方式访问存储器。
  • 静态 RAM(SRAM)更快,密度更低,消耗更多功率。

只读内存 ROM

ROM 可以在工厂编程。闪存是现场可编程 ROM 的主要形式。

  1. 电可擦除,必须块擦除。
  2. 随机访问,但是写入/擦除比读取慢得多。
  3. NOR 闪存更加灵活。
  4. NAND 闪存更密集。

闪存

  • 非易失性存储器:闪存可以在线(in-circuit)编程。
  • 闪存可以被电擦除和重新编程。
  • 轻便、紧凑、节能且更便宜。

闪存写入

  1. 写比读慢得多:写 1.6μs,读 70ns。
  2. 块很大(大约 1 Mb)
  3. 写入会导致磨损,最终损坏设备:现代寿命约一百万次写入。

闪存类型

  1. NOR(放置固态代码:因为还有 XIP):字可读取,逐块擦除。
  2. NAND:按页读取(512-4K 字节),逐块擦除。NAND 相对便宜,擦除速度更快,顺序访问时间更短。

NOR 和 NAND 闪存之间的区别

内存架构

  1. 平面单空间(Flat single-space)
  2. 分段式(Segmented)
  3. 组切换(Bank-switched)
  4. 多类型存储区(Multiple-space)
  5. 虚拟内存(Virtual)
平面单空间内存 分段内存
组切换内存 多空间内存

平面单空间内存

  1. 简单
  2. 示例:68K,Z80
  3. 空间可能不连续
  4. Assumed by C
  5. 关心零地址

分段内存

  1. 地址空间增加
  2. 示例:Intel x86
  3. 2 部分地址:段、偏移
  4. 需要 C 扩展:近和远

组切换内存

  1. 可以添加到任何处理器
  2. 进入更大地址空间的窗口
  3. 链接器支持有用

多空间内存

  1. 示例:68K 选件,8051
  2. 可能需要 C 语言扩展

虚拟内存

  1. 增加表观内存大小
  2. 交换磁盘上的数据
  3. 不是实时的
  4. 增加了不确定性

缓存

  1. 并不是严格的内存架构
  2. 可能经常被程序员忽略
  3. 优化有效使用的关键

Cache 操作

  1. 许多主内存位置被映射到一个高速缓存条目。
  2. 可能具有以下内容的缓存:指令;数据;数据 + 指令(统一)
  3. 内存访问时间不再确定。

术语

  1. Cache hit: 所需的位置在缓存中。
  2. Cache miss: 所需的位置不在缓存中。
  3. Working set: 程序在一个时间间隔中使用的一组位置。

内存系统性能

  1. h = cache 命中率
  2. \(t_{cache}\) = 缓存访问时间,\(t_{main}\) = 主存储器访问时间
  3. 平均内存访问时间:\(t_{av} = ht_{cache} + (1-h)t_{main}\)
  4. 一般真正使用作为衡量的是系统最坏情况

多级缓存访问时间

  1. \(h_1\) = 缓存命中率。
  2. \(h_2\) = L2 的命中率。
  3. 平均内存访问时间:\(t_{av} = h_1t_{L1} + h_2t_{L2} + (1- h_2 - h_1)t_{main}\)

更换策略

  1. 更换策略:选择要丢弃的缓存条目以为新的内存位置腾出空间的策略。
  2. 两种流行的策略:
    1. 随机访存。
    2. 最少最近使用(LRU)。

缓存性能优势

  1. 将经常访问的位置保存在快速缓存中。
  2. 高速缓存一次检索多个单词:首次访问后顺序访问速度更快。

内存管理单元

  • 内存管理单元(MMU)转换地址:

内存管理任务

  1. 允许程序在执行期间在物理内存中移动。
  2. 允许虚拟内存:
    1. 存储器映像保存在二级存储器中;
    2. 图像在执行期间按需返回到主存储器。
  3. 页面错误:请求的位置不驻留在内存中。

内存管理单元

  1. 主要是 32 位处理器
  2. 可以是内置的或可选的
  3. 提供内存保护
  4. 通常由 RTOS 管理
  5. 2 种方法
    1. 阻塞[写保护]存储区
    2. 流程模型实施