在ARMv7中,对于Security Extension我有个疑惑,以下均是我自己的理解,如果有误还望指出:
一些通过Coprosessor访问的寄存器有些是Banked,也就是说从Secure world和Non-secure world访问这些寄存器时实际上访问到的是两个不同的寄存器。然而还有一些寄存器有类似于"In a system that uses security, this register is writable only by Secure write"这样的限制。Monitor Mode一定是Secure Mode,但是为了在Monitor中访问那些banked的寄存器,SCR.NS需要根据需要来调整。我的疑惑在于,SCR.NS=1时既然可以访问到那些banked寄存器中non-secure的版本,那么这个时候如果写寄存器还算是Secure write吗?对于那些没有banked的寄存器却有secure write限制的,在Monitor中写这样的寄存器需要把SCR.NS设置成0吗?
谢谢!
顺便问下..."a register is banked for secure world" 其中的bank有比较惯用的翻译方法吗?多谢!
多谢大神!
那么如果是在MMU被enable之前呢?我现在在做一个Cortex A7 baremetal RTOS,reset后立刻就切换到了svn_ns,并且打算一直跑在ns里。后来发现一些寄存器要求secure访问,我就写了一个smc handler,需要时临时执行一个smc然后trap到自己的handler里去访问对应的寄存器。我现在对GIC和Generic Timer 的init是在MMU之前,那这个时候在mon_ns状态访问memory mapped寄存器到底是secure访问还是non secure 访问呢?
Mon mode 的总线访问都是secure的。
听起来似乎你的应用场合对security没有需求。一般来说,这种场合下我们建议让CPU一直处在secure状态,这样可以减少不必要的限制,获得所有资源的访问权限。
对的,起初我也是这么觉得,所以之前一直都是在secure状态下。然而我们的RTOS需要在某个时候作为Linux的bootloader,将控制权交给Linux。现有的Linux kernel只能跑在ns状态,并且我不是很懂Linux,我所有对CPU的初始化如果都是做在Secure world里的话,那么在跳到Linux之前的那一刻再切换到ns不知道留一个没有初始化的ns world给linux有没有问题,所以就换了种方案,早早的先跳到ns world去。请问大神在这方面可有什么建议?
另外,我刚发了一个关于GIC初始化的帖子,希望也能帮忙看一眼啊,多谢!GICv2在non-secure环境的初始化问题