请阅读【嵌入式开发学习必备专栏 之Cortex-M33 专栏】

文章目录

SAU NSC 介绍安全状态(Secure state)非安全状态(Non-secure state)非安全可调用(Non-secure Callable, NSC)区域NSC 介绍

配置 NSC

SAU NSC 介绍

ARMv8-M 架构引入了 TrustZone 技术,它提供了一种机制来实现在单个处理器内部的安全隔离。这项技术定义了两种状态:安全状态(Secure state)和非安全状态(Non-secure state)。在此架构下,可以同时运行安全和非安全代码,并且通过硬件保护确保两者之间的隔离。

为了允许非安全代码安全地调用安全函数而不会破坏系统的安全性,ARMv8-M 引入了一种特殊的机制,即 非安全可调用(Non-secure Callable, NSC)区域。以下是一些详细解释:

安全状态(Secure state)

安全状态下的代码能够访问所有资源,包括安全和非安全内存以及外设。任何要执行的安全代码都必须首先经过认证,并且通常被用来处理敏感数据和执行安全相关的任务。安全状态下可以执行任务,如加密操作、安全启动、安全存储等。

非安全状态(Non-secure state)

非安全状态下的代码不能直接访问安全资源。这被用来运行较少敏感的或者第三方的应用代码。

非安全可调用(Non-secure Callable, NSC)区域

如果实施了安全扩展,则 4GB 内存空间将划分为安全和非安全内存区域。安全内存空间进一步分为两种类型:

安全(S);非安全可调用(NSC: Non-secure Callable)。

NSC 介绍

NSC 区域是安全内存中的一个特殊区域,安全世界可以将其配置为允许非安全世界的代码进行限制性调用,这种类型的内存是 Armv8-M 处理器允许保存 SG 指令的一种内存,使软件能够从非安全状态转换为安全状态。这些区域通常包含一些入口点,比如封装了安全函数的跳转指令。比如,通常 NSC 内存区域包含小型分支跳转(entry points)的表。 为了防止非安全应用程序分支到无效入口点,这里有Secure Gateway (SG) 指令。。当非安全代码试图调用安全函数时,它会跳转到 NSC 区域中的入口点,然后由这个入口点安全地转发到真正的安全函数。

通过将 SG 指令的功能限制在 NSC 内存中,安全软件创建者无需在正常安全内存中意外包含 SG 指令或数据共享编码值,包含 NSC 内存位置。

当非安全程序调用安全端的函数时:

API 中的第一条指令必须是 SG 指令。SG 指令必须位于由 安全属性单元 (SAU :Security Attribution Unit) 或实施定义的属性单元 ( IDAU : Implementation Defined Attribution Unit) 定义的 NSC 区域中。

引入NSC内存的原因是为了防止其他二进制数据,例如查找表,其值与SG指令的操作码相同,作为进入安全状态的入口函数。 通过分离 NSC 和 Secure 内存类型,包含二进制数据的 Secure 程序代码可以安全地放置在 Secure 区域中,而无需直接暴露于 Normal 世界,并且只能使用 NSC 内存中的有效入口点进行访问。

配置 NSC

配置 NSC 区域通常涉及设置内存保护单元(MPU)或安全属性单元(SAU)的相关区域,使其具有 NSC 属性。这通常在系统启动时,由安全世界的启动代码完成。

NSC 区域中的函数通常会使用 BXNS 指令来返回到非安全状态,确保返回时正确地恢复非安全状态的上下文。 在设计安全系统时,正确配置和使用 NSC 区域是保护系统免受未授权访问和潜在漏洞影响的关键部分。

推荐阅读: https://blog.csdn.net/weixin_42135087/article/details/122391507

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。