Architecture 处理器中的MMU(内存管理单元)单元如何保护内存段

Architecture 处理器中的MMU(内存管理单元)单元如何保护内存段,architecture,embedded,Architecture,Embedded,在介绍一种嵌入式处理器体系结构时,我看到了块MMU,它主要提到了内存保护功能 我可以知道吗 MMU如何实现这种保护,以及为什么需要这种保护? 什么是记忆保护 除了保护(如虚拟寻址),MMU还有什么其他用途 请考虑没有OS的嵌入式系统.< /P> __Kanu内存保护意味着系统上的每个进程都在自己的虚拟地址空间中运行,从本质上说,每个进程的运行就好像它自己拥有一个系统的主内存一样。这也意味着一个进程不能改变为另一个进程保留的内存;这对于系统的稳定性和安全性至关重要(例如,程序不能简单地扫描系统内存

在介绍一种嵌入式处理器体系结构时,我看到了块MMU,它主要提到了内存保护功能

我可以知道吗

MMU如何实现这种保护,以及为什么需要这种保护? 什么是记忆保护

除了保护(如虚拟寻址),MMU还有什么其他用途

请考虑没有OS的嵌入式系统.< /P>


__Kanu

内存保护意味着系统上的每个进程都在自己的虚拟地址空间中运行,从本质上说,每个进程的运行就好像它自己拥有一个系统的主内存一样。这也意味着一个进程不能改变为另一个进程保留的内存;这对于系统的稳定性和安全性至关重要(例如,程序不能简单地扫描系统内存以找到您刚才键入的密码)

MMU还提供许多其他功能(虚拟内存、动态重定位等)

这就是为什么。要回答“如何”,你应该做得更进一步

MMU(内存管理单元)是一个基本的系统块,它需要单独的和受保护的内存空间。我将保持这个简单,因为整本书都可以写关于内存管理硬件和策略

如果没有保护,在任何进程中运行的程序都可以访问任何其他进程的内存。即使您忽略了安全隐患,这也意味着一个程序中的错误可能会覆盖属于其他进程的内存。调试这类问题并不容易,因为症状与原因相去甚远

因此,需要某种组织原则,以便每个进程只能查看和修改分配给它的内存。而且,由于会发生错误,因此该组织必须由硬件支持,这样即使意外访问错误的内存部分也很困难

这样做的一个优点是,还可以使每个进程的内存映射看起来完全相同。链接器可以将每个程序定位在相同的起始地址,将堆栈和堆放在可预测的区域,并为与内核的交互保留内存

MMU是硬件组件,它实现从进程使用的逻辑地址到硬件使用的物理地址的转换。它还提供安全特性,例如仅将内存的某些部分标记为可执行文件。它提供了内核实现进程交换和虚拟内存所需的数据结构,因此属于进程A的内存页甚至不能被进程B看到,但A和B都可以被可信内核看到

为了以实用的方式实现这一点,物理内存被划分为页面,通常大小为4KB。每个逻辑地址分为一个页码和一个偏移量。页码索引MMU中的一个表,该表将每个逻辑页转换为某个物理地址。这种转换发生在每个内存访问周期中。一个物理页面可以映射为一个或多个进程(在这种情况下,它可能也在一个空闲页面池中)

一个进程的堆栈、数据和堆通常由映射到该进程的页面组成。这有助于防止一个进程中的错误影响其他进程,因为每个进程只能写入自己的堆栈、数据和堆页面

如果物理内存的同一页映射到多个进程中,那么这些进程就可以看到它。这就是Windows或Unix上的.so共享DLL的方式:保存程序文本的页面映射到链接到它的每个进程中


MMU有一种机制,在访问未映射到进程的页面时引发异常。处理该异常可以实现虚拟内存,并随着进程需求的变化增加分配给进程的内存量。

对于使用内存的处理器(大多数)有某种内存接口,有些有名称(如amba、axi、wishbone),有些没有。从处理器的角度来看,这是地址和数据,请读取或写入该地址的内容。在过去的好日子里,你会有一条总线,你的闪存、ram和外围设备会坐在这条总线上,查看地址的某些(通常是高位)位,以确定它们是否被寻址,如果是这样,那么从数据总线读取或在数据总线上跳转,否则保持三态。今天,根据芯片等的不同,一些内存解码发生在内核内或内核附近,您与内核或芯片的公共接口可能有多条总线,可能有特定的闪存总线、特定的sram总线和特定的dram总线等

因此,平坦线性地址空间的第一个问题是,即使将其分为闪存和ram,ram部分也是平坦的,对于N个字节,地址为0到N-1。对于非嵌入式操作系统,为了让人们的生活更轻松,如果程序只能通过某种方式假设它们都是从地址0或地址0x100或地址0x8000开始的,而不必为下一个可用内存空间进行编译,或者操作系统不必在任务切换时将一个程序从较低的内存中完全移出并替换为另一个程序。一个古老的简单方法是使用intels段:偏移方案。程序总是在同一个位置启动,因为在启动程序之前,代码段已被调整,并且偏移量用于执行(此模型非常简化的视图),当在程序之间切换任务时,您只需更改代码段,即可为下一个程序恢复pc。一个程序可能位于地址0x1100,另一个位于0x8100,但两个程序都认为它们位于地址0x0100。对所有开发人员来说都很容易。MMU通过在进程上获取该地址来提供相同的功能