撰写完10圆觉标识符,我发了篇专文聊著Rust
2023-01-27 23:25:52

存有一类轻松的撰写专文编程词汇吗?

Rust 词汇因其mammalian安全可靠性而深受众多合作开发人员的喜爱,曾在多个榜单上荣膺最受欢迎编程词汇。完圆不过,觉标俏媳妇与公爹的美好生活_免费入口精品现在有人花费大批时间撰写 10 圆觉 Rust 标识符之后,识符撰写网志阐明 Rust 词汇的发篇一系列优点,以下是聊著网志的主要文本。

我深入研究 Rust 是撰写专文为的是改进由 Xobs 撰写的 Xous 作业控制系统。Xous 是完圆两个用纯 Rust 撰写的微Mach输入输出作业控制系统,是觉标为的是轻量 (IoT / PDP规模) 的安全可靠优先选择网络平台(比如 Precursor)而撰写的,用作 MMU 的识符硬体强制性型页面级缓存保护。

一年来,发篇他们为 Xous 作业控制系统添加了许多机能,聊著包括网络 (TCP/UDP/DNS)、撰写专文用作逻辑系统和多词汇文本的完圆合作开发工具图形抽象化、存储(以加密的觉标形式)、PDDB、可信开启(trusted boot)以及密钥管理库等。

他们决定撰写他们的作业控制系统而并非采用 SeL4、Tock、QNX 或 Linux 等现有实现,俏媳妇与公爹的美好生活_免费入口精品是因为他们想真正了设备中每带队标识符都在做什么。特别是对于 Linux,它的源标识符库非常庞大且动态,即便开放源码,也不可能搞清其Mach中的每带队标识符。因而,Xous 仅全力支持他们的网络平台,以尽可能避免Mach不必要的复杂程度。

这样减少应用范围还意味著他们还能充分利用 CPU 在 FPGA 中运转的优势 。因而,Xous 以一类不寻常的 RV32-IMAC 实用性为目标:具有 MMU + AES 扩展的实用性。

FPGA 意味著他们有能力在硬体级别上修复 API 错误,从而使Mach更加精简。这对于从 RAM 中处置诸如挂起和恢复之类的抽象化破坏(abstraction-busting)进程尤其重要。

他们建立 Xous 时研究了大批的控制系统编程词汇,最后 Rust 脱颖而出。当时它刚刚开始全力支持 `no-std`,它的特点是强类别、缓存安全可靠,具有良好的工具和新型生态控制系统。我个人是强类别词汇的忠实拥护者,而缓存安全可靠性不仅有利于控制系统编程,还能使优化器更好地生成标识符,并且 Rust 适用作mammalian。

事实上,我期望 Precursor 有两个全力支持标记操作符和缓存机能的 CPU,近似于 CHERI。于是他们和 CHERI 研发团队进行了许多讨论,但显然他们非常专注于 C 词汇,也没足够的带宽来全力支持 Rust。总体而言,C 比 Rust 须要 CHERI 多得多,他们的选择是符合资源优先选择原则的。他们不采用 C 词汇,但出于安全可靠性考量,我期望有一天 Rust 中会存有硬体强制性型胖操作符(fat pointer)。

不过,Rust 词汇绝并非轻松的,甚至给他们的合作开发带来了很多难题。下面我列举一下 Rust 的优点。

句法混乱复杂。

我发现 Rust 句法密集、繁重且难以阅读,比如:

Trying::to_read::<&'a heavy>(syntax, |like| { this. can_be( maddening ) }).map(|_| ())?;

简单来说,下面的标识符近似于在对象(事实上是 `struct`)上调用两个名为「to_read」的方法。

还有一类不遵循 Rust 句法规则的宏和命令也能运转:

#[cfg(all(not(baremetal), any(feature = “hazmat”, feature = “debug_print”)))]。

下面的语句中最令我困惑的是采用‘=’来表示等价而并非赋值,因为实用性命令中的文本并非 Rust 标识符,它就像两个完全独立的元词汇。

再比如,Rust 宏的时效性也存有难题——即便是我他们撰写的许多 Rust 宏也「只是勉强工作」。

一类可靠的词汇不应该存有这些句法难题。

Rust 的确很强大,它的国际标准复本包含 HashMaps、Vecs 和 Threads 等计算机程序,丰富且易用性高。不过,Rust 的「std」库并没为他们构筑可审计的标识符库带来任何好处。

Rust 不够完善。

他们撰写 Xous 的标识符时,引入了两个叫作「const generic」的新类别。在此之前,Rust 没原生能力来处置多于 32 个原素的数组,这个限制令人感到恐惧。

在撰写 Xous 的过程中,Rust 的H55N汇编、工作空间等机能逐渐成熟,这意味著他们须要重新审视已经写好的标识符,以使关键性的初始开启标识符集成进他们构筑的控制系统。

Xous 合作开发的第一年都是采用’no-std’完成的,代价是占用大批缓存空间且复杂程度高。尽管能撰写两个只有预先重新分配的、静态大小的计算机程序的作业控制系统,但为的是适应最坏情况下的原素数量,因而他们不得不推出许多他们的计算机程序。

大约一年前,Xobs 将 Rust 的 `std` 库移植到 Xous,这意味著他们能在平衡的 Rust 中出访堆,现在 Xous 与特定版本的 Rust 存取。

`std` 库从根本上将缓存重新分配、缓存建立等「不安全可靠」的硬体结构转变成了「安全可靠」的 Rust 结构。

不过,我必须不断提醒他们,拥有 `std` 库并不能消除关键性标识符中的安全可靠漏洞风险——它只是将许多关键性标识符移动到国际标准复本。

Rust 有固定的预览周期,这意味著他们也必须定期预览 Xous ,以保持与词汇的相容性。

但这可能是不可持续的。最后,他们须要锁定标识符库,但我没明确的退出策略。也许他们能考量仍然采用 `no-std` 以获得平衡的 `alloc` 机能来出访堆。但这样他们就还须要采用 Vec、HashMap、Thread 和 Arc/Mutex/Rc/RefCell/Box 构造等,以使 Xous 能够被有效编码。

Rust 在供应链安全可靠方面堪忧。

在 rustup.rs VirtualDub中有如下标识符:

`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`。

用户能下载脚本并在运转之前对其进行检查,这似乎比 vscode 的 Windows .MSI 旧版本好得多。但是,这种做法遍及整个构筑生态控制系统,让我对通过 crates.io 生态控制系统发起的软件供应链攻击的可能性感到不安。

Crates.io 也存有一类拼写错误,很难确定哪些 crate 是好或坏;许多完全按照用户想要的名称命名的 crate 放弃提供所需机能,而积极维护的 crate 必须采用不太直观的名称。当然,这并非 Rust 独有的难题。

还有两个事实是,依赖项是链式的。也就是说当你从 crates.io 拉入两个东西时,你也会拉入该 crate 的所有从属依赖项,以及它们所有的 build.rs (http://build.rs/) 脚本,这些最后都将在你的机器上运转。因而,仅审核 Cargo.toml 文件中明确指定的 crate 是不够的——您还必须审核所有相关 crate 是否存有潜在的供应链攻击。

幸运的是,Rust 确实允许您采用 Cargo.lock 文件将 crate 固定在特定版本,并且能完全指定依赖 crate 。他们试图在 Xous 中通过发布 Cargo.lock 文件并将他们所有的一阶相关 crate 指定为次要修订的策略来缓解这个难题。

不过,他们的大部分调试和测试框架都依赖于许多相当花哨和复杂的 crate,这些 crate 引入了大批的依赖项,即便我尝试为他们的目标硬体运转构筑,在主机上运转的依赖 crate 和 build.rs 脚本还是被构筑。

针对这个难题,我撰写了两个名为「crate-scraper」的小工具,它为他们的 Cargo.toml 文件中指定的每个源下载源包,并且将它们存储在本地,这样他们就能获得用作构筑 Xous 版本的标识符快照。

它还运转两个快速的「分析」程序——搜索名为 build.rs 的文件并将它们整理到两个文件中,这样我就能更快地通过 grep 查找明显的难题。当然,手动审查并并非检测嵌入在 build.rs (http://build.rs/) 文件中巧妙伪装的恶意软件的实用方法,但它至少让我了解了他们正在处置的攻击面的规模。令人惊讶的是,他们审查出来自各种第三方的大约 5700 行标识符,用作操作文件、目录和环境变量,并在我的计算机上运转其他程序。

我不确定这个难题是否有更好的解决方案,但是,如果你的目标是构筑可信赖的固件,请警惕 Rust 广泛的软件供应链攻击面。

无法复现别人的 Rust 构筑。

我对 Rust 的最后一点看法是,一台计算机上的构筑无法在另一台上复现。

我认为这主要是因为 Rust 将源标识符的完整路径作为内置到二进制文件中调试字符串的一部分。这导致了许多糟糕的情况,比如他们在 Windows 上构筑的工作成功了,但在 Linux 下却失败了,因为二者的路径名非常不同,这会导致许多缓存对象在目标缓存中被转移。

公平地讲,这些失败是由于 Xous 中存有错误,这些错误已经得到修复。但是,最后仍会有用户向他们报告他们无法复现,因为他们在构筑控制系统上的路径与他们的不同。

最后,我想说尽管这里列出了所有的怨言,但如果能重来,Rust 仍然是他们用作构筑 Xous 所用词汇的有力竞争者。我用 C、Python 和 Java 完成了很多大型项目,所有这些项目最后都背负着「不断增加的技术债务」,而 Rust 能规避这些难题。

(作者:产品中心)