我正在尝试在启用TrustZone的开发板(Samsung exynos 4412)上将Linux内核作为安全操作系统运行。尽管有人会说安全操作系统应该小而简单。但是我只想尝试。并且如果可能的话,那么将一个Trustlet应用程序编写或移植到此安全操作系统将变得容易,特别是对于具有UI(受信任UI)的应用程序而言。
我购买了具有基于Xv6的可运行安全操作系统的开发板,而常规操作系统是Android(Android版本4.2.2,内核版本3.0.15)。我试图用android Linux内核替换简单的安全os,即在前面添加一些汇编代码,例如清除SCR寄存器的NS位,直接称为Linux内核条目(传入必要的内核标记列表) 。
内核未压缩的代码可以正确执行,并且内核的第一个C函数start_kernel()也可以执行。除了运行calibrate_delay()之外,几乎所有初始化函数都运行良好。该函数将等待改变的变化:
/* wait for "start of" clock tick */
ticks = jiffies;
while (ticks == jiffies);
我猜想原因是没有时钟中断生成(我在时钟中断回调函数中打印日志,但它们从未被获取)。我在local_irq_enable()函数之前和之后检查了CPSR状态。 IRQ和FIQ位设置正确。我还将在中断向量表中定义的Linux内核的IRQ处理程序中打印一些日志。没有记录。
我知道安全世界和非安全世界之间的中断系统可能会有所不同。但是我找不到任何文档之间的差异。有人可以指出吗?最重要的问题是,由于Linux是一个非常复杂的操作系统,Linux内核可以作为TrustZone安全操作系统运行吗?
我是Linux内核和ARM TrustZone的新手。请帮我。
最佳答案
默认情况下,将Linux作为安全的世界操作系统运行是标准的。即,安全的世界主管是最受信任的,并且可以轻松过渡到其他模式。安全世界是ARM CPU的一种操作概念。
注意:仅因为Linux在安全的世界中运行,并不会使您的系统安全! TrustZone和安全世界是可用于构建安全系统的功能。
但是我只想尝试。并且如果可能的话,那么将一个Trustlet应用程序编写或移植到此安全操作系统将变得容易,特别是对于具有UI(受信任UI)的应用程序而言。
TrustZone允许对软件进行分区。如果您在同一层中同时运行Linux和trustlet应用程序,则没有任何用处。 trustlet只是一个普通的应用程序。
trustlet的正常模式是在启动时设置监视器矢量页并锁定物理访问。然后,Linux内核可以使用smc
指令来调用trustlet中的例程,以访问DRM类型的功能以解密媒体等。在这种模式下,Linux作为正常的世界OS运行,但是可以在安全模式下调用有限的功能。通过您定义的SMC
API实现。
除了运行calibrate_delay()
以外,几乎所有初始化函数都运行良好。
这是无功能中断的症状。 calibrate_delay()
在等待滴答计数通过系统计时器中断增加时运行紧密循环。如果您在安全环境中运行,则可能需要路由中断。寄存器GICD_ISPENDR
可用于强制中断。您可以使用它来验证ARM GIC是否正常运行。另外,内核命令行选项lpj=XXXXX
(其中XXXX是一些数字)可以跳过此步骤。
在正常系统中,很可能某些外设中断路由器,时钟配置或其他中断/定时器初始化是由引导加载程序完成的,而您错过了这一点。引导新板总是很困难;借助TrustZone更是如此。