1168|2

274

帖子

8

TA的资源

纯净的硅(初级)

楼主
 

[ ST NUCLEO-U575ZI-Q 测评] 4-TrustZone模式下-将非安全区代码注册到安全区 [复制链接]

非安全区代码调用安全区的代码,需要通过NSC的代码做中介。

1.代码存放位置与特点

NSC的代码,是在安全区的工程中"secure_nsc.c"文件中创建的。在这个文件中的创建函数,并且需要以CMSE_NS_ENTRY作为前缀创建函数。如下面的代码所示。

CMSE_NS_ENTRY void SECURE_change_exit_secure(uint8_t flag)
{
	if(flag == 0x30){
		NVIC_DisableIRQ(EXTI13_IRQn);
		HAL_EXTI_ConfigLineAttributes(EXTI_LINE_13,EXTI_LINE_NSEC);
		NVIC_SetTargetState(EXTI13_IRQn);
		NVIC_EnableIRQ(EXTI13_IRQn);
	}else if(flag == 0x31){
		NVIC_DisableIRQ(EXTI13_IRQn);
		HAL_EXTI_ConfigLineAttributes(EXTI_LINE_13,EXTI_LINE_SEC);
		NVIC_ClearTargetState(EXTI13_IRQn);
		NVIC_EnableIRQ(EXTI13_IRQn);

	}
}

CMSE_NS_ENTRY是编译器的一个保留字,原型为__attribute((cmse_nonsecure_entry)) 。这个关键字用于声明一个入口函数,这个入口函数就可以提供给非安全区的代码进行调用。

我们可以在这个入口函数中编写一些只能在安全区进行的操作,比如retarget中断,正如上面的代码所示,将EXIT13中断的执行函数从安全区切换到非安全区,或者反过来。

2.NSC的代码是怎么体现给非安全区的代码的

在安全区编译代码的时候会将"secure_nsc.c"编译成库,输出.o的文件。同时非安全区的代码引入其头文件,这样就可以调用"secure_nsc.c"文件中的函数了。

3.非安全区调用安全区的函数,能否传递参数和获取返回值

写在NSC的安全区代码是可以包含参数和返回值的。但是参数是有限制的,参数必须是通过寄存器传递的,而不能通过栈传递。所以函数的参数个数不能超过4个,而且数据不能过大,否则就会放到栈上,造成无法传递。为什么不能将栈中的数据传递呢?因为安全区和非安全的寄存器是隔离的,安全区和非安全区都有自己的SP寄存器,因此当从非安全区切换到安全区时,是不能访问到非安全区的栈顶指针的。

想传递多个参数怎么办?可以通过指针的形式传递一个数组或结构体。因为指针指向的是内存的区域,而且安全区是可以访问非安全区的数据的。

非安全区也是可以获得安全区代码的返回值的。

此帖出自无线连接论坛

最新回复

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html   详情 回复 发表于 2023-1-12 09:21
点赞 关注
 

回复
举报

6815

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

当从非安全区切换到安全区时,是不能访问到非安全区的栈顶指针的,总结可以借鉴

 

此帖出自无线连接论坛
 
 

回复

1万

帖子

2853

TA的资源

管理员

板凳
 

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html

此帖出自无线连接论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表