2010-09-30 78 views
5

虽然经历了一种嵌入式处理器架构,但我已经看到了块MMU,它主要提到内存保护功能。处理器中的MMU(内存管理单元)单元如何保护内存段

可我知道,

的MMU这是如何保护和为什么需要? 记忆保护是什么意思?

MMU除保护(如虚拟寻址)以外的其他用途是什么?

请考虑一个没有OS的嵌入式系统。

__Kanu

+0

需要'家庭作业'标签吗? – 2010-09-30 07:59:58

+0

不是。;-) – 2010-09-30 09:10:27

+0

没有更多的更新? – 2010-09-30 11:03:56

回答

14

对于使用存储处理器(大部分)有某种类型的存储器接口,有些人的名字(例如AMBA,AXI,叉骨),有些则没有。从处理器角度来看,这是地址和数据,请读取或写入该地址的内容。在过去的美好时光中,你将拥有一辆公共汽车,你的闪存,RAM和外围设备将坐在这辆巴士上,查看地址的某些(通常是高位)位,以确定它们是否被解决,如果是,则读取或跳转数据总线保持三态。今天取决于芯片等,一些内存解码发生在内核中或接近内核,并且你的公共接口到内核或芯片可能是几条总线,可能有特定的闪存总线,以及特定的总线和特定的总线总线等

所以,你必须具有平坦的线性地址空间,即使分成闪存和RAM的第一个问题,冲头部分是平的,地址0到N-1对N个字节。对于非嵌入式操作系统来说,如果程序假定它们全都从地址0或地址0x100或地址0x8000开始,而不必以某种方式为下一个可用内存的任何编译方式空间,或者操作系统不必将程序从低端内存中完全移出,并在任何时间切换时将其替换为另一个。一个简单的方法是使用intels segment:offset scheme。程序总是从相同的地方开始,因为在启动程序之前调整了代码段并且使用了偏移量来执行(这个模型的非常简化的视图),当程序中的任务切换时,您只需更改代码段,将PC恢复为下一个节目。一个程序可以在地址0x1100处,另一个在0x8100处,但是两个程序都认为它们在地址0x0100处。适合所有开发人员。 MMU通过在处理器总线上获取该地址并将其称为虚拟地址来提供相同的功能,mmu通常位于处理器存储器接口与芯片/世界其余部分之间的处理器附近。因此,您可以再次将mmu看到地址0x0100查看表中的内容并将其转到物理地址0x0100,然后当您执行任务切换时更改表格,以便下一次读取0x0100时将转至0x1100。每个程序都认为它在地址0x0100上运行,链接,编译,开发,加载和执行代码不那么痛苦。

下一个功能是高速缓存,存储器保护等,所以处理器及其存储器控制器可以在到达MMU,或许某些核心寄存器或许MMU控制本身之前解码部分地址。但是其他的东西,比如内存和外设,可能会在mmu的另一边,高速缓存的另一边,这通常是mmu外洋葱的下一层。当轮询你的串口时,例如看看是否有另外一个字节可用,你不希望数据访问被缓存,这样串口状态寄存器的第一次读取实际上在物理总线上出去并触及串口,然后全部后续读取读取缓存中的陈旧版本。你确实需要这样的内存值,即缓存的目的,但是对于像状态寄存器这样的易变的东西,这是非常糟糕的。因此,根据您的系统,您可能无法打开数据缓存,直到启用mmu。例如,ARM上的存储器接口具有控制位,它们指示它是什么类型的访问,它是不可缓存的访问可缓存的,突发的一部分,诸如此类。因此,您可以启用独立于数据缓存的指令缓存,并且如果没有mmu,它将直接将这些控制信号传递给缓存控制器,缓存控制器然后连接到外部世界(如果它没有处理事务)。所以你的指令获取可以缓存其他所有不被缓存的内容。但是为了缓存数据RAM访问,而不是从串口缓存状态寄存器,你需要做的是为mmu设置表格,并且在你的嵌入式环境中,你可以选择简单地将RAM映射到一个,这意味着地址0x1000 virtual变为0x1000 physical ,但现在可以为该块内存启用数据高速缓存位。然后,对于您的串行端口,您可以将虚拟映射到物理地址,但可以清除该块内存空间的数据高速缓存使能位。现在您可以启用数据缓存,现在缓存内存(因为通过mmu时控制信号被标记为这样,但是对于您的寄存器访问,控制信号指示不可缓存)。

您当然不必将虚拟映射到物理映射,取决于嵌入式还是非嵌入式,操作系统与否等等。但这就是您的保护功能所在。在操作系统中最容易看到。应用程序层的应用程序不应该被允许获取受保护的系统内存,内核等。不应该能够破坏其他应用程序的内存空间。所以当应用程序切换时,mmu表反映了允许访问的内存以及不允许访问的内存。程序不允许的任何地址都会被mmu捕获,产生一个异常/故障(中断),并且内核/主管得到控制并可以处理该程序。您可能还记得早期Windows时代的“一般保护错误”一词,在公司的市场营销和其他利益集团决定我们应该更改名称之前,它是英特尔手册中的直接内容,当您遇到错误时中断被解雇那不属于其他类别,就像一个测试的选择题A bob,B ted,C alice,D以上都没有。一般的保护错误并不在于上述的目录,而是最广泛的命中,因为当你的程序试图访问分配的内存空间之外的内存或I/O时,你会得到这种错误。

mmus的另一个好处是malloc。在这之前,内存分配必须使用方案来重新安排内存,以便在中间保留大的空块。对于下一个大的malloc,为了尽量减少“4meg免费为什么我的1kbyte分配失败?”。现在,就像一张磁盘一样,您将内存空间分割成4k字节或一些这样的大小块。一个malloc的大小是一个块或更小,在内存中使用任何空闲块使用mmu表条目来指向它,并为主叫方提供与该mmu条目关联的虚拟地址。你需要4096 * 10个字节,诀窍是不必找到那么多的线性内存,但找到10个线性mmu表条目,取任意10个内存块(不是非常接近的)并将它们的物理地址放入10 mmu条目中。

底线是“它是如何做的”,它通常位于处理器和高速缓存之间,或者如果没有高速缓存物理内存总线。 mmu逻辑查看地址,使用它查看表格。表中的位包括物理地址加上一些包含可缓存的控制信号,以及指示这是否是有效条目或保护区域的某种方式。如果该地址受到保护,则mmu会将中断/事件触发回内核。如果它有效,它会修改虚拟地址,成为mmu外/其他位置的物理地址,像可缓存位这样的位用于告诉mmu的另一端是什么类型的事务,如指令,数据,可缓存,突发等。对于嵌入式,非操作系统,单一任务系统,您可能只需要一个mmu表。例如,在操作系统中执行保护的一种快速方法是,为每个应用程序或表的一个子集(类似于目录结构的树)创建一个表,以便在任务切换时只需更改一件事,该表的开始或树的一个分支的开始,以将树的该分支的虚拟地址改变为物理地址并分配内存(保护)。

+0

这确实使MMU的概念正确。感谢! – 2010-09-30 20:12:38

+0

增加对malloc的想法,因为你处于一个虚拟地址空间,它可能比物理内存的数量大得多,所以你有更好的机会找到线性mmu表条目。这不是一种情况,你可能在堆中有100 * 4096个字节的内存直接用物理访问进行管理,而现在你只有100 mmu的表项在同一个系统中,你可能有数百个mmu表条目,管理这100个物理内存块。 – 2010-09-30 20:27:14

3

内存保护是指系统上的每个进程在它自己的虚拟地址空间中运行,从本质上讲,每个进程运行似乎有一个系统的主存储器中的所有本身。这也意味着一个进程不能改变为另一个进程保留的内存;这对于系统稳定性和安全性至关重要(例如,程序不能简单地扫描系统内存以找到刚输入的密码)。

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

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

7

MMU(内存管理单元)是希望拥有独立和受保护的内存空间的系统的基本块。我将保持这一点,因为整本书可以写成关于内存管理硬件和策略......

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

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

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

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

为了以实用的方式实现此目的,物理内存分为多个页面,通常大小为4KB。每个逻辑地址都被分成一个页码和一个偏移量。页码索引MMU中将每个逻辑页面转换为某个物理地址的表格。这种翻译发生在每个内存访问周期中。一个物理页面可以被映射到没有进程(在这种情况下它可能也在一个免费页面池中),恰好一个或几个。

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

如果物理内存相同的页面被映射到多个进程,那么它是那些可见的。这是Windows上的一个DLL或Unix上的一个.so上的共享:持有程序文本的页面被映射到每个链接到它的进程。

的MMU有当一个页面被访问尚未映射到进程抛出异常的机制。处理该异常可以实现虚拟内存,并随着需求的变化而增加分配给进程的内存量。

+1

好的。那么没有操作系统的系统支持MMU呢?那意味着如何在没有OS的嵌入式系统中定义MMU? – 2010-09-30 09:14:00

+2

@Renjith G:如果没有操作系统,您通常会将MMU配置为单个地址空间,通常使用直接物理=虚拟映射。您可能会将代码空间配置为只读,以防止意外或恶意修改。然而,没有OS或RTOS意味着单线程/进程操作,因此保护一个线程或处理数据空间不受其他问题影响的能力不是问题。 – Clifford 2010-09-30 16:44:14

+0

感谢您的评论。 – 2010-09-30 20:10:29