Linux内核可以作为ARM TrustZone安全操作系统运行吗?

时间:2014-09-02 07:48:22

标签: linux-kernel arm interrupt trust-zone

我正在尝试在支持TrustZone的开发板(Samsung exynos 4412)上运行Linux内核作为安全操作系统。虽然有人会说安全操作系统应该小而简单。但我只想尝试一下。如果可能,那么将trustlet应用程序写入或移植到此安全操作系统将很容易,尤其是对于具有UI(可信UI)的应用程序。

我用基于Xv6的可运行安全操作系统购买了开发板,而普通操作系统是Android(安卓版本4.2.2,内核版本3.0.15)。我试图用android Linux内核替换简单的安全操作系统,也就是说,提前用一些汇编代码,比如清除SCR寄存器的NS位,直接调用Linux内核条目(传入必要的内核标记列表)

正确执行内核未压缩代码,并且还执行内核的第一个C函数start_kernel()。除了运行到calibrate_delay()之外,几乎所有初始化函数都运行良好。这个函数将等待jiffies改变:

/* 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的新手。请帮帮我。

3 个答案:

答案 0 :(得分:2)

默认情况下,将Linux作为安全世界操作系统运行。即,安全的世界主管是最值得信赖的,可以轻松过渡到其他模式。 安全世界是ARM CPU的操作概念。

注意:仅仅因为Linux在安全的环境中运行,并不能确保您的系统安全! TrustZone和安全世界是您可以用来建立安全系统的功能。

  

但我只想尝试一下。如果可能,那么将trustlet应用程序写入或移植到此安全操作系统将很容易,尤其是对于具有UI(可信UI)的应用程序。

TrustZone允许对软件进行分区。如果在同一层中同时运行Linux和 trustlet 应用程序,则没有用处。 trustlet 只是一个普通的应用程序。

trustlets 的正常模式是在启动时设置监视器矢量页面并锁定物理访问。然后,Linux内核可以使用smc指令调用 trustlet 中的例程来访问DRM类型功能以解密媒体等。在这种模式下,Linux作为普通的世界操作系统运行,但是可以通过您定义的SMC API在安全世界中调用有限的功能。

  

几乎所有初始化函数都运行良好,但运行到calibrate_delay()

这是无效中断的症状。 calibrate_delay()在等待 tick 计数通过系统计时器中断增加时运行紧密循环。如果您在安全的环境中运行,则可能需要路由中断。寄存器GICD_ISPENDR可用于强制中断。您可以使用它来验证ARM GIC是否正常运行。此外,内核命令行选项lpj=XXXXX(其中XXXX是某个数字)可以跳过此步骤。

很可能某些外设中断路由器,时钟配置或其他中断/定时器初始化是由正常系统中的引导加载程序完成的,而您却错过了这一点。启动新电路板总是很困难;使用TrustZone更是如此。

答案 1 :(得分:1)

从技术上讲,没有什么能阻止Linux在ARM处理器的安全状态下运行。但它击败了TrustZone的全部目的。一个庞大,复杂的内核和操作系统(如Linux)是不可行的,无法正式验证它可以被认为是"安全"。

有关该方面的进一步阅读,请参阅http://www.ok-labs.com/whitepapers/sample/sel4-formal-verification-of-an-os-kernel

至于您所面临的具体问题 - 安全与非安全状态下的中断处理应该没有什么特别之处(除非您明确将其配置为不同)。但可能是您删除的安全操作系统正在执行一些现在没有进行的初始计时器初始化。

3.0.15也是一个绝对古老的内核 - 它是在2年前发布的,基于3年前发布的内容。

答案 2 :(得分:1)

您所说的有些问题需要澄清。首先,您是在尝试运行Secure world内核还是正常世界内核?你说你想在NW的SW和Android中运行Linux,但你的问题是,“我试图用android Linux内核替换简单的安全操作系统”。那你在哪个内核遇到问题?

其次,你提到清除NS位。这没有多大意义。如果设置了NS位,清除它需要意味着您已经在NW中运行(正如设置的位将指示),您已执行SMC指令,切换到监控模式,将NS位设置为0,然后恢复SW寄存器。是这种情况吗?

就中断而言,您是否已为每种执行模式正确初始化VBAR,即Secure world VBAR,Normal world VBAR和MVBAR。除了在NSACR和其他设置中设置正确的值之外,还需要设置所有三个,以确保中断被引导到正确的执行世界,而不是仅仅由SW处理。此外,对于所有三种模式,您都需要单独的异常向量表和处理程序。您最初可能只能使用一组,但是一旦使用TZASC对内存系统进行分区,您将需要单独的一切。

TZ需要大量配置,而不是简单地通过设置/取消设置NS位来处理。对于Exynos 4412,必须正确设置许多TZ控制寄存器才能在NW中执行。不幸的是,用户指南的公共版本中没有涉及它们的任何信息。您需要完整版本才能获得在此处理器上实际运行SW和NW内核所需的所有值和地址。