中电网移动|移动中电网|高清图滚动区

使用内存管理单元

内存管理单元 (MMU) 包含在或适用于范围广泛的嵌入式 CPU。在某些情况下,它们的使用是强制性的;在其他情况下,它们可能代表不需要的开销。本文着眼于 MMU 的作用以及它们的应用方式。对多任务的进程和线程模型进行了比较和对比,并考虑了一个可能在安全性和性能要求之间提供折衷的中间选项。

物理地址和逻辑地址 

当您次开始学习如何编程时,地址的概念并不重要,因为语言使程序员免受此类麻烦的影响。只有当开发人员想要理解或编写汇编语言或者真正了解指针所发生的事情时,地址才会成为关注点。

内存的每个字节都有一个的地址。实际上这并不完全正确,因为某些处理器架构使用多个地址空间,但终每个字节都可能以某种方式指定。通常,系统只有一个起始地址为零的内存区域。这不是一个固定的规则,因为内存架构可以设置为地址空间从某个其他值开始。其他系统有多个可能不连续的内存区域——例如,程序和数据内存可能是分开的。

这些地址是物理地址,是 CPU 及其周围系统发出的值,并由内存系统解码。对于许多系统,物理地址直接对应于软件使用的逻辑地址。在其他系统中,没有这样的匹配。由于多种原因,逻辑地址和物理地址之间可能会出现差异。

如果 CPU 具有分页内存架构,则软件可以使用比访问完整(物理)地址空间所需的地址更短的(逻辑)地址。调整“页面”会在物理地址空间中移动一个地址窗口。例如,初的 x86 架构使用 16 位逻辑地址(提供 64K 范围)和 20 位物理地址(多访问 1M)。设置基址寄存器可以使逻辑地址空间映射到 1M 空间内的 64K 区域(在 16 字节边界上)。

分页寻址现在并不常见。更典型的是,CPU 使用 32 位地址来访问平坦的 4G 地址空间。但是,逻辑地址和物理地址之间可能仍然存在不对应关系,因为内存管理单元 (MMU) 处理 CPU 发出的地址。MMU 提供了很大的灵活性,可以将物理内存重新映射到方便的逻辑地址。它还可以使部分物理地址空间无法被软件访问,这是一种强大的保护机制。

操作系统和多任务 

大多数现代嵌入式系统都是使用某种操作系统构建的。这可能是一个简单的多任务内核,也可能是具有广泛服务的实时操作系统 (RTOS),也可能是像 Linux 这样的“完整”操作系统。广义上讲,任何一种操作系统都支持多任务模型,可能是“线程模型”,也可能是“进程模型”;这两种类型的本质特征是使用或不使用 MMU。

多任务——线程模型 

市面上的RTOS产品大多是线程模型。这意味着所有任务(现在称为线程)的代码和数据以及 RTOS 本身都占用相同的地址空间,如图1所示。


图 1:使用线程模型的多任务处理

理论上,但希望不会在实践中,一个线程可以访问和/或破坏另一个线程或 RTOS 的代码和数据。显然,如果代码经过正确调试并且来自可信赖的,这种可能性只会让人产生兴趣。线程模型的一大好处是上下文切换很快,因为只需要保存和恢复 CPU 寄存器。

多任务——进程模型 

高端操作系统,如 Linux 和 Windows,以及一些 RTOS 产品,使用进程模型。通过使用 MMU,每个任务(现在称为进程)占用自己的私有地址空间,从地址 0 开始,如图2所示。实际上,进程给人的印象是它可以独占访问整个机器。


图 2:使用流程模型的多任务处理 

这种模型有一个很大的好处,即每个进程都无法访问,甚至不知道其他进程的内存或操作系统本身的内存。这允许构建更安全的系统,其中行为不当或严重错误的进程应该不会对系统的其余部分产生影响。缺点是上下文切换比线程模型慢得多,因为除了 CPU 寄存器的保存和恢复之外,还需要使用 MMU 重新映射内存。

线程保护模式 

一些 RTOS 产品通过限制使用 MMU,同时仍然使用线程模式提供了一个有趣的折衷方案。这通常称为“线程保护模式”。该功能的实现使得在上下文切换时,只有当前线程有权访问的内存(即它自己的内存以及任何共享或特定的 RTOS 内存区域)才可见。这会稍微增加上下文切换时间,因为需要设置 MMU,但这比进程模型所需的完全重新映射的开销要低。图 3 显示了一个系统,其中任务 2 处于控制状态,而图 4 显示了当任务 4 获得控制权时调整 MMU 的结果。


图 3:在控制任务 2 的情况下使用线程保护模式进行内存管理


图 4:使用线程保护模式进行内存管理,任务 4 获得控制权

总结 

现代嵌入式 CPU 通常包含一个 MMU,或者一个可以作为一个选项提供。要使用像 Linux 这样的高端操作系统,MMU 是必不可少的。对于大多数 RTOS 产品,MMU 不是必需的,但在许多情况下,它可用于提供一些额外的安全性。

猜你喜欢
中电网移动|移动中电网|频道导航区