[ ST NUCLEO-U575ZI-Q 测评] 4-TrustZone模式下-将非安全区代码注册到安全区
<div class='showpostmsg'><p data-line="61" dir="auto">非安全区代码调用安全区的代码,需要通过NSC的代码做中介。</p><h4 data-line="62" dir="auto" id="1%E4%BB%A3%E7%A0%81%E5%AD%98%E6%94%BE%E4%BD%8D%E7%BD%AE%E4%B8%8E%E7%89%B9%E7%82%B9">1.代码存放位置与特点</h4>
<p data-line="63" dir="auto">NSC的代码,是在安全区的工程中"secure_nsc.c"文件中创建的。在这个文件中的创建函数,并且需要以<code>CMSE_NS_ENTRY</code>作为前缀创建函数。如下面的代码所示。</p>
<pre>
<code class="language-cpp">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);
}
}</code></pre>
<p data-line="81" dir="auto">CMSE_NS_ENTRY是编译器的一个保留字,原型为__attribute((cmse_nonsecure_entry)) 。这个关键字用于声明一个入口函数,这个入口函数就可以提供给非安全区的代码进行调用。</p>
<p data-line="83" dir="auto">我们可以在这个入口函数中编写一些只能在安全区进行的操作,比如retarget中断,正如上面的代码所示,将EXIT13中断的执行函数从安全区切换到非安全区,或者反过来。</p>
<h4 data-line="84" dir="auto" id="2nsc%E7%9A%84%E4%BB%A3%E7%A0%81%E6%98%AF%E6%80%8E%E4%B9%88%E4%BD%93%E7%8E%B0%E7%BB%99%E9%9D%9E%E5%AE%89%E5%85%A8%E5%8C%BA%E7%9A%84%E4%BB%A3%E7%A0%81%E7%9A%84">2.NSC的代码是怎么体现给非安全区的代码的</h4>
<p data-line="85" dir="auto">在安全区编译代码的时候会将"secure_nsc.c"编译成库,输出.o的文件。同时非安全区的代码引入其头文件,这样就可以调用"secure_nsc.c"文件中的函数了。</p>
<p data-line="87" dir="auto"></p>
<h4 data-line="89" dir="auto" id="3%E9%9D%9E%E5%AE%89%E5%85%A8%E5%8C%BA%E8%B0%83%E7%94%A8%E5%AE%89%E5%85%A8%E5%8C%BA%E7%9A%84%E5%87%BD%E6%95%B0%E8%83%BD%E5%90%A6%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0%E5%92%8C%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E5%80%BC">3.非安全区调用安全区的函数,能否传递参数和获取返回值</h4>
<p data-line="91" dir="auto">写在NSC的安全区代码是可以包含参数和返回值的。但是参数是有限制的,参数必须是通过寄存器传递的,而不能通过栈传递。所以函数的参数个数不能超过4个,而且数据不能过大,否则就会放到栈上,造成无法传递。为什么不能将栈中的数据传递呢?因为安全区和非安全的寄存器是隔离的,安全区和非安全区都有自己的SP寄存器,因此当从非安全区切换到安全区时,是不能访问到非安全区的栈顶指针的。</p>
<p data-line="93" dir="auto">想传递多个参数怎么办?可以通过指针的形式传递一个数组或结构体。因为指针指向的是内存的区域,而且安全区是可以访问非安全区的数据的。</p>
<p data-line="95" dir="auto">非安全区也是可以获得安全区代码的返回值的。</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>当从非安全区切换到安全区时,是不能访问到非安全区的栈顶指针的,总结可以借鉴</p>
<h4 data-line="89" dir="auto" id="3%E9%9D%9E%E5%AE%89%E5%85%A8%E5%8C%BA%E8%B0%83%E7%94%A8%E5%AE%89%E5%85%A8%E5%8C%BA%E7%9A%84%E5%87%BD%E6%95%B0%E8%83%BD%E5%90%A6%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0%E5%92%8C%E8%8E%B7%E5%8F%96%E8%BF%94%E5%9B%9E%E5%80%BC"> </h4>
<p>测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html</p>
页:
[1]