艾巴生活网

您现在的位置是:主页>科技 >内容

科技

为什么要使用MPU(MPU如何实现内存保护)

2024-11-12 13:04:53科技帅气的蚂蚁
先解释一下MPU。MPU有很多含义。一些常见的例子有:MPU:内存保护单元,内存保护单元(本文有描述);MPU:微处理器单元,微处理器;此外,有人

为什么要使用MPU(MPU如何实现内存保护)

先解释一下MPU。MPU有很多含义。一些常见的例子有:

MPU:内存保护单元,内存保护单元(本文有描述);

MPU:微处理器单元,微处理器;

此外,有人可能与MPU-6050等模块相关联。所以,我们不要混淆MPU。

为什么要用MPU?

如果你开发的嵌入式项目因为内存溢出或内存故障造成了重大经济损失或重大事故,你就能理解为什么要使用内存保护单元(MPU)了。

在嵌入式系统中使用内存保护单元(MPU)可以在开发初期发现内存引起的bug,节省更多的开发时间。同时,在项目后期修改bug或者增加功能,可以减少修改文档和测试所需的时间。也就是说,通过使用MPU,可以避免修改一个bug导致多个bug的情况(0生成1,1生成一切)。

如何利用微处理器实现内存保护

简单来说,就是保护所有与当前执行的代码无关的数据。

以RTOS任务A和B为例:任务A和B不应该相互交互,但是有一个错误。任务A可能会不小心写入一些任务B偶尔使用的数据,不会影响任务A的正确操作,但是当任务B试图使用损坏的数据时,任务B可能会意外失败。如果MPU没有配置阻止任务A写任务B的数据,这个错误可能需要开发者很长时间才能跟进。如果误差很小,或者任务B很少使用数据,就很难解决bug。但是如果用MPU的话,bug会发现的比较早。在某些架构上,MPU甚至可以帮助你检测空指针引用,因为你可以设置MPU区域来防止非特权代码访问内存0x0。应用程序中一组设计良好的MPU区域可以保护重要的内存区域,以防止特定的问题。一个很好的例子是通过在MPU区域的末端放置一个缓冲区来防止缓冲区溢出。您还可以将任务堆栈放在非特权代码无法访问的区域。如果这样做,每个任务必须使用它自己的MPU区域之一来设置它自己对自己的堆栈的访问权限。

使用微处理器的优势

无论是操作系统还是裸机系统,如果没有防止恶意访问错误内存的能力,系统都会存在重大的安全问题和安全漏洞雷区。

使用的内存保护单元(MPU)有许多优点。MPU通常允许你在特权或非特权模式下运行,并使用一组“区域”来确定当前执行的代码是否可以访问代码和数据。每个区域是一个连续的内存块,具有一组权限,对内存的特权和非特权访问。与非特权代码的子集相比,特权代码通常可以访问大部分(但不是全部)内存。在整个系统运行期间,这些区域不必相同。MPU区可以根据每个任务进行修改,每个任务可以有自己唯一的区集,可以在任务转入运行状态时进行配置。这允许您仅为需要代码和数据的任务设置访问权限。MPU的嵌入式操作系统将在每次上下文切换期间管理每个任务的区域和权限级别。例如,设置两个RTOS任务不同的内存保护区:

大家能看懂上图吗?闪存区和存储区分别受到保护。两个全局保护区:Flash启动和RAM启动;在Flash中,它的一部分只能被Task 1访问,而这部分不能被Task访问;同时,在Flash的其他区域,只有任务2可以访问,而任务1不能。如果这两个区域互相访问,就会产生MPU故障。在RAM区,在同一部分区域,一个只能读,一个只能写。如果不按约定操作,MPU也会失效。

什么时候不用MPU?

通常有两种情况不能使用处理器上的MPU功能:

一个简单的项目

对绩效至关重要的项目。

第一个很简单:一个很简单的应用基本上不需要使用MPU,但是增加了系统的复杂度。不用设置外围设备的内存保护、RAM、MPU区,一眼就能发现bug。性能要求高的第二个项目,上下文切换时设置内存保护,堆栈那些操作,可能会影响系统的实时性能,从而导致系统异常。这个要结合项目实际情况考虑,还是要用MPU功能?审计刘清