之前看到了 TockOS(Rust实现的实时操作系统)团队在2015年写过的论文:https://www.tockos.org/assets/papers/tock-plos2015.pdf

在论文里面该团队总结了 Rust 开发嵌入式的一些不足,以及他们总结出来 Rust 需要改进的地方。然而,这其实是TockOS 犯下的一个乌龙错误。

我来帮大家梳理一下整个乌龙事件的过程,并且帮助大家对嵌入式开发特点有一个基本认识。

嵌入式开发的一些特点

嵌入式开发特点:

  • 嵌入式系统通常使用缺乏硬件保护机制的处理器和微控制权,比如内存管理单元,当硬件无法保护软件的时候,语言的安全性则可以保护软件。
  • 嵌入式应用程序对崩溃的容忍度较低,因为它们无法依靠用户干预来从运行时错误中恢复(例如,重启应用程序)。
  • 调试嵌入式内核非常困,因为通常没有日志功能,并且需要物理访问来连接调试器。

虽然安全性无法防止逻辑错误 或 产生Bug,但是它确实能极大保护嵌入式内核免受硬崩溃。不幸的是,对于系统编程来说,通常的安全语言典型的附加特性,其缺点往往超过这些优点。例如,GC会引入不确定性延迟,自动内存分配器使常见的内核优化变得复杂,例如Slab分配。而 Rust 语言,则是在无GC的情况下保证了安全性和性能。TockOS的目标是在内存少于1MB字节的嵌入式平台使用,比如仅有64KB内存的开发平台。怎么看,Rust都是非常适合这个开发目标的。

2015年:Rust 所有权机制带来的问题

但是,在 2015年的论文里,TockOS团队提出,Rust 的所有权在实现嵌入式内核的时候,遇到了三个问题:

  • Rust 的自动内存管理没有针对系统中经常出现的硬件资源和设备驱动程序进行优化。

  • 由于项目的基本设置中存在线程不安全问题,Rust的 所有权模型阻止了闭包和其他内核代码之间的资源共享。

  • 尽管闭包对于简化事件处理是理想的,但对于嵌入式系统而言,它们对动态内存的要求却是有问题的。

为了更好地支持事件驱动的嵌入式平台,TockOS 团队探索了一种可能的语言功能,称之为「执行上下文(execution contexts)」。当基础硬件约束或执行模型可以可靠地防止并发问题时,此功能将为 Rust 提供一个有价值的工具,用于允许安全的内存共享。Rust 所有权机制在很多系统下是没有问题的,但是在一些使用基于非线程的并发模型的系统以及必须共享资源的情况下则无法正常工作。比如,嵌入式操作系统避免了诸如线程之类的内存密集型机制,而是选择了事件驱动的并发性。类似地,微控制器通常没有硬件内存管理单元,并且不支持虚拟内存。因此,它们避免了动态内存机制,这是因为不可能交换内存以在内存耗尽时正常降级,也因为可以明确禁止动态分配。为了避免所有权带来的一些问题,团队使用了各种hack的写法,但是反而破坏了对嵌入式操作系统利用编译时安全检查的目的。

2017年:然而,过了两年发现乌龙了

然后,在2017年的时候,TockOS 发现,他们其实是因为对 Rust 的认识不深,导致了误解。然后又马上发了一篇新的论文来纠正之前的错误认知。问题的解决方法也比较简单:使用Rust的内部可变性。博客:https://www.tockos.org/blog/2017/apsys-paper/论文:https://www.tockos.org/assets/papers/rust-kernel-apsys2017.pdf在新的论文中,TockOS团队说:

以我们在Rust中编写资源高效的嵌入式内核的经验发现,仅需一小部分不安全的抽象就可以形成通用的内核构建块。所以,我们认为 Rust 选择使用线性类型系统来避免运行时内存管理将使下一代安全操作系统成为了可能。

Unsafe 代码的安全抽象

在新的论文里讲到,TockOS中需要信任两种类型的 Unsafe 代码。

  • 第一个由Rust语言团队编写的Rust语言机制和库组成。这些提供了安全的接口,但是它们基本都是基于Unsafe代码的安全抽象。

  • 第二种必须信任的代码是由内核开发人员编写的内核代码部分,这些部分使用Unsafe代码来实现基本的操作系统功能,但又可以提供安全的接口。

具体来说,内核依赖于以下四个使用 Unsafe 代码的Rust抽象形式:

  • 边界检查:数组经过边界检查,因此 Unsafe 代码使用length字段来确保访问是安全的。
  • 迭代器优化:跨Rust数组操作的规范方法是使用迭代器,这些迭代器使用Unsafe代码来避免不必要的中间检查。
  • 编译器内部函数和基本类型强制转换。
  • 使用Cell。

论文后面还有很多关于嵌入式硬件抽象的内容,就不一一罗列了。这个故事告诉我们,做 Rust 开发,一定要先掌握好 Rust 的概念,否则会造成乌龙。

2020年:Tock OS 现状

打开TockOS团队最新博客看了一眼,真不得了。https://www.tockos.org/blog/2020/hello-opensk/

Google发布的这个 OpenSK 是跑在 Tock上面的!

插一段新闻

如今,FIDO安全密钥通过提供一种简单的两因素身份验证(2FA)来防止网上诱骗,从而保护了帐户,这种形式正变得越来越广泛。但是,并非每个人都可以访问和使用它们。为了促进和改善对FIDO Authenticator实现的访问,Google宣布发布OpenSK,这是用Rust编写的安全密钥的开源实现,该密钥同时支持FIDO U2F和FIDO2标准。

该项目将帮助业余爱好者,硬件供应商和研究人员进行开发和创新。通过刷新Nordic芯片加密狗上的OpenSK固件,人们可以制作自己的安全密钥。

除了价格低廉外,Google解释说选择Nordic芯片加密狗作为初始参考硬件是因为它支持FIDO2中提到的所有主要传输协议,包括NFC,低功耗蓝牙,USB和专用硬件加密内核。此外,Google提供了可定制的3D打印保护套,可以在各种打印机上使用。

根据Google的说法,OpenSK是用Rust编写的,可在TockOS上运行,以提供更好的隔离性和更简洁的操作系统抽象以支持安全性。Rust具有强大的内存安全性和零成本的抽象性,从而使代码不易受到逻辑攻击。通过其沙箱体系结构,TockOS提供了安全密钥小应用程序,驱动程序和内核之间的隔离,这是构建深度防御所需的。Google对TockOS的贡献,包括闪存存储系统和补丁,已上传到TockOS存储库的上游。

谷歌还表示,希望将OpenSK扩展到其他类型的芯片,并带来更多创新和新功能,以及更强大的嵌入式加密技术。

看见了吗?Google的OpenSK 也是 Rust实现的:https://github.com/google/OpenSKRust 正在悄悄的改变世界!

感谢阅读

rust编程之道 pdf_深挖一篇嵌入式内核论文之后,我发现 Rust 正在悄悄改变世界...相关推荐

  1. rust编程之道 pdf_LPC: 想在内核里引入Rust,还需要做很多决定

    在今天的Linux Plumbers Conference 2020大会上,Geoffery Thomas等人以"Barriers to in-tree Rust"为主题,讨论了想 ...

  2. 留言获赠书 | 朱春雷:Rust编程:入门 实战与进阶

    祝微信公众号 乐生活与爱IT 的读者朋友们,五一劳动节,吃好喝好睡好玩好,节日快乐! 今天给读者朋友们一个福利,请您在文章后面留言,留言比较精彩的,且获赞数比较多的朋友(至少3位),将有机会获得一本, ...

  3. 【深挖字符串操作】·万字总结,这些知识点你真的懂了吗?

    大家好,我是Duoni!  开始前言 博主介绍:一位不愿透露姓名的艺术生跨界分子 学习阶段:C语言进阶 信念支撑:业精于勤,只要足够肝,世间就没有跨不了的界! 阅前请求:博主自愧没有任何计算机基础,之 ...

  4. 深挖数据价值 阿里云栖开年大会报道

    本文讲的是深挖数据价值 阿里云栖开年大会报道[IT168 云计算]经历风雨,转身看到彩虹.在这个"化云为雨"的时节,造云大咖们角色扮演也逐步渐入佳境,或随需而动,或引领潮流.阿里云 ...

  5. 读《编程之道》-对于程序员的抽象描述

    <编程之道>的第二篇是"古代的大师(The Ancient Masters)",不知道悟道非常深的作者为何在编程大师的前面加上了个"古代"来修饰,我 ...

  6. Rust 编程有什么好?

    Rust是一种现代系统级编程语言,在设计时考虑了安全性,此外,它提供零成本抽象.泛型.功能特性等等.但是通常对于开发者来说,Rust上手门槛较难,而它究竟难在了哪里?此外,它还具备哪些优势以及缺点?接 ...

  7. 《编程之道》第三册:《计算机寓言--信息时代的启示》

      目录  引言 第一篇 秋 第二篇 冬 第三篇 春 第四篇 夏 引言  (一次前前往西藏拉萨的超越机器学院的旅行.)  虽然我的C.P.Yu博士通信交往已有多年,但我从来没有见过他的面.去年< ...

  8. 【优雅编程之道】之数组的7点建议

    开心一笑 [小明喜欢上一个刚来的女同事,她是医院里的检验师,为了套近乎就经常跑到她科室去倒开水喝,熟了后就发现她随身的小包包里总放着一把小水果刀,于是我问她:你总放把小刀包里干嘛?她答道:下夜班防身啊 ...

  9. 《编程之道》第二册:《编程之禅》

    前言    <编程之道>的出版在程序设计业内得到了普遍的接受,出版社邀请我翻译一些与之相关的文章,以作为那部著名的经典之作的补充.虽然,我申明我的能力难以胜任,但我最终还是被说服试一试.  ...

最新文章

  1. 引用与传递——内存分析
  2. 贪吃蛇一直显示正在连接服务器,贪吃蛇大作战进不去怎么办 解决方法
  3. 深度学习(十七)——SSD, YOLOv2
  4. catalog java,Java Connection getCatalog()方法与示例
  5. 项目管理中网络图的看法和相关参数阅读说明
  6. ReactJs和React Native的那些事
  7. [CV招聘]中科院空间应用工程与技术中心2019年校园招聘
  8. [C#.Net]判断文件是否被占用的两种方法
  9. linux智能灌溉流程,农田自动灌溉系统及灌溉方法与流程
  10. vue中的VNode
  11. 改了个字符串 项目无法启动,springboot循环依赖问题分析
  12. xcode6 使用MJRefresh
  13. jenkins+maven+gitlab触发构建
  14. [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解...
  15. 如何用键盘快捷键打开 macOS 控制中心?
  16. 电源大师课笔记 2.3
  17. 如何实现Solidworks批量修改工程图模板?
  18. 图片文字识别如何实现
  19. Unity 使用 iTween
  20. 科技信息它们叫嚣:没有我们,谈什么iPhone8!

热门文章

  1. Windows Server 2012R2 DHCP故障转移(3)
  2. 用DHCP实现网关配置和DNS解析
  3. 计算字符串和文件的MD5值
  4. 基于SSH实现医院在线挂号系统
  5. IDEA只修改代码提示为不区分大小写
  6. 结合不同的模型进行集成学习
  7. 通过Spark listener实现Direct模式读取Kafaka数据
  8. .NET Framework 4.7 安装
  9. redis分布式锁实现思路
  10. datatable报错 uncaught TypeError: Cannot read property 'aDataSort' of undefined