Starnix 实现的 Linux UAPI 具有与 Linux 内核实现尽可能接近的语义。Linux UAPI 的历史悠久而传奇,其中既有许多出色的想法,也有一些不太理想的想法。为了成功运行未修改的 Linux 二进制文件,Starnix 保持不偏不倚的立场。它实现了 Linux UAPI 的实际功能,而不是试图强制执行理想化的设计。Starnix 按照 Linux UAPI 的规定实现了。
这种方法可简化调试。当在 Starnix 下运行的 Linux 程序行为不正确时,原因可分为以下两类:
程序依赖于 Linux 不支持的行为:如果程序在 Linux 内核上以相同的方式失败,则问题出在程序本身,而不是 Starnix。
Starnix 实现的 UAPI 不准确:如果程序在 Linux 内核上运行正常,但在 Starnix 上运行失败,那么如果更改 Starnix 以更准确地实现 UAPI,Starnix 将能够正确运行该程序。
新语义的风险
向 Linux 用户空间公开 Linux 内核中不存在的功能或行为违反了精确兼容性原则。引入特定于 Starnix 的设备、文件系统、系统调用或伪文件会带来分歧风险。
这种差异会造成兼容性冲突:一个应用可能依赖于标准 Linux 语义,而另一个应用则无意中依赖于特定于 Starnix 的行为。在这种情况下,使 Starnix 与 Linux 内核保持一致以修复第一个应用可能会导致第二个应用出现问题。
公开实现细节(例如 Starnix 如何使用底层 Fuchsia 原语来实现 Linux UAPI)是有风险的,因为这些细节通常必须更改才能提高语义准确性。例如,虽然目前 Linux 和 Fuchsia 概念可能存在一一对应的关系,但未来的发展可能需要更灵活的实现才能完全匹配 Linux 概念的细微差别。
例外情况和注意事项
这种一般方法存在一些限制。Starnix 会尽可能遵循 Linux UAPI,但功能必需性和安全性要求决定了它必须做出一些偏差。
Fuchsia 集成:Starnix 向 Linux 用户空间公开了
remotefs(一种 Fuchsia 特有的文件系统)。由于fxfs必须向系统公开,因此 Starnix 通过remotefs公开它,而不是假装fxfs是ext4或其他特定的 Linux 文件系统;伪装成其他真实的文件系统类型会导致严重的实现困难。Starnix 还公开了一些 Fuchsia 特有的设备,例如magma设备,这是实现图形性能所必需的。安全排除项:Starnix 避免实现 Linux UAPI 中极其危险的方面。例如,包含设备物理内存的
/dev/mem未实现,因为它存在严重的安全隐患。功能演变:在某些情况下,功能最初被省略,但后来又添加了。例如,Starnix 最初并未实现
suid,但最终添加了该功能,以支持需要标准 Linux 内核语义的重要 Linux 程序。