Overlay使一个进程欺骗系统,使其认为它包含在分配给它的内存中;但同时可以分配多倍的空间。这就是我对叠加层的理解。
它们如何在现实生活场景中实施(尤其是嵌入式系统)?
答案 0 :(得分:2)
"他们是如何实施的??"
非常仔细。不要自愿去那里 - 我怀疑你现在需要使用嵌入式系统中常见的32位CPU。
您不会选择实施叠加层 - 当您的CPU的基本地址空间(或CPU可访问的物理内存)不足以容纳所有内容时,它们是IMO绝望的解决方法您需要适应的代码或数据,您需要仔细的硬件和软件设计来支持实施。
为什么你需要使用我所谓的绝望方法?也许是因为您已经在CPU特定架构中获得稳定/大量投资,但您的代码需求却超出了它。
我将在这里讨论一个基于ROM的嵌入式系统的例子,其中代码已经超出了核心CPU的存储空间,我将其简单地描述为“经典”#34;嵌入式系统,代码完全从ROM运行,RAM也是有限的,没有大容量存储。大型嵌入式系统当然还有其他场景,这些场景从RAM运行,甚至还有大容量存储。
在基于ROM的嵌入式系统中,硬件设计可能提供固定的代码库,一组固定的RAM(即两者都不重叠)和内存空间中的一个或多个窗口,其中可见通过向一些专用存储器映射寄存器输出存储体编号,从较大的ROM / RAM存储区域中选择该窗口。通过这些窗口可以看到可能是ROM和RAM,但除非你想让自己的事情变得非常困难,否则你会专注于其中一个。
有时你会发现一个实现硬件支持的CPU。很久以前我使用的是Hitachi 64180,它是一个Z80(具有16位内存寻址架构),增加了内存映射硬件,允许映射到1M字节的物理内存空间 - 这是一个令人兴奋且几乎难以想象的地址空间当时。你可以很容易地用一个Z80外部的芯片实现一个简单的(不太通用的)重叠内存管理。
为什么Zilog / Hitachi在35年前打扰生产带有内存映射硬件的Z80?因为他们在Z80中拥有大量的现有市场份额(它本身基于英特尔8080),并且通过这种绝望的解决方案可以为他们的客户提供一种编写更大代码的方法,而不会丢弃他们现有的基于Z80的代码并重新开始。我认为他们能够尽可能地成功 - 64180的作品,而且他们的客户也没有任何其他方法可以突破64kbyt障碍。
在50年前的类似位置,数字设备公司拥有一个非常成功的PDP-11系列16位处理器,并希望通过提供迁移路径来保持其客户,因此他们实施了类似的硬件覆盖管理从64kbyte扩展到256kbyte寻址。它工作了几年,但你不会选择在这种平台上开始任何新设计,而不是你有任何选择。
如果代码的一部分被重叠,则必须非常仔细地设置代码 - 中断例程必须始终位于固定存储区中,因为它们可能随时被调用。常见例程也应该始终存在,并且在重叠的段中,您必须确保没有内部重叠调用,或者您的编译器通过固定库中的代码进行这些调用以及它们的返回来切换重叠的库在所需的叠加之间。类似地,在RAM中,堆栈必须始终位于固定RAM存储区中,并且必须注意正确地将RAM引用到存储区窗口中 - 如果只有一位代码引用存储区RAM区域,则最简单。
叠加不是很好。为了使叠加工作,你最终做了很多工程工作。与覆盖相关的错误很难确定和调试,因为它们可能非常短暂。我的建议是:除非你在角落里支持,否则不要去那里。
(已编辑以添加更多背景信息,这是基于ROM的嵌入式系统中叠加层的描述)
答案 1 :(得分:1)
“嵌入式系统”是一个广泛的领域,我怀疑没有“一个答案”涵盖所有嵌入式系统方案。
对于初学者来说,对于具有MMU的系统来说,覆盖是不必要的,因此能够支持虚拟内存。在这些目标上,人们通常会部署一个能够运行的操作系统,或者或多或少地透明地执行虚拟内存管理。
在许多嵌入式系统中,代码完全由ROM运行的情况下,叠加层根本不适用。
虚拟内存和覆盖技术在任何需要硬实时确定性行为的情况下都不适用于许多嵌入式系统。
对于任何意义上的覆盖,您需要一个能够从RAM运行代码的体系结构和一个用于存储覆盖代码段的大容量存储系统。在软件术语中,您需要在ARM的嵌入式代码映像中使用链接器支持链接器和覆盖管理器,并使用ARM RealView工具链(因此也适用于Keil工具),可以找到一个示例{{3更多链接器详细信息here
最终,您使用叠加层来解决在第一个实例中最好避免的问题。在受约束的传统硬件上实现大型应用程序可能是必要的,但是您不希望从一开始就设计这样的约束 - 如果这是针对新的硬件设计,则在第一个实例中设计具有足够内存的硬件。
可能使覆盖不必要的另一个发展是QSPI“就地执行”。来自至少here和Atmel的微控制器支持这种技术,该技术允许内存映射只读和执行访问QSPI端口上的内存,而不是地址/数据总线。由于在任何情况下通常都可以使用类似的存储器设备来包含覆盖层,因此使用QSPI是一种更简单的解决方案。