在今天的Linux Plumbers Conference 2020大会上,Geoffery Thomas等人以“Barriers to in-tree Rust”为主题,讨论了想要把Rust引入到Linux内核项目中作为一种可选的开发语言,还需要解决的一些问题。

Rust适合作为内核开发语言主要有两点原因:

  1. Rust是一个C语言很好的替代,很符合Linux内核对编程语言的需求:没有垃圾回收,更符合内核的面向对象模型。
  2. 使用Rust更容易编写安全的代码。造成安全问题的use-after-free,缓存溢出,未初始化的内存等等的程序缺陷很容易避免。

Rust的优势让很多开发者感受到了吸引力。对新项目来说,选择Rust的技术困难可能不太大,但是对已有项目来说,到底有多可行呢?Linux社区已经在严肃的考虑这个问题。除了“可能没人懂Rust的patch怎么review因为没有用过Rust”这种鸡生蛋的问题以外,还有一些更加实际的项目框架问题需要考虑:

Cargo和库

Cargo是Rust官方的项目管理工具,可以安装和管理依赖,也可以控制构建过程。Geoffery认为虽然cargo的依赖管理对内核完全没有用(比如编译内核的过程不能依赖从网络上下载一个库,所有的代码都必须是in-tree的),但是使用cargo还是有一定的意义的(具体是什么并没有深入)。

Rust的语言的运行时包含core / alloc / std三个层级,其中core是最核心的,内核代码也需要用到。alloc需要运行时里包含动态内存管理,这个在内核里是有的(kmalloc),但是有人指出,内核GPF_*的API可能比较难适配。std库基本是封装操作系统的输入输出,文件操作等API,所以在内核里是用不到的。

跟C语言之间的ABI

两个语言之间如何互相调用?这个Rust是支持的,也不是Linux特有的问题,工具也有,但是如果大量的涉及到一些比较底层的操作,比如位操作、#ifdef检测config、以及各种C的预处理技巧,怎么在Rust里保持一致等等,可能会导致一些混乱。感觉像trace这样的框架,是不是需要用Rust重新实现一次呢?

RCU

内核使用了很多精细的同步机制,比如RCU。在讨论到怎么样从Rust访问RCU保护的数据时,Geoffery认为从语言层面是可行的,也有一些代码适配的进展。具体可以见

https://github.com/fishinabarrel/linux-kernel-module-rust/pull/250

除此之外,还有一些Rust语言特性导致的数据结构区别,比如双链表等,似乎也不是很大的困难——常见问题已经有一些可以参考的库和unsafe大法来解决(来自Rust社区的说法)。

GCC编译

rustc目前依赖LLVM作为编译工具,但是GCC仍然是内核的主流编译方式。使用LLVM编译整个内核可能是目前比较可行的做法,因为大家对混合LLVM+GCC的方式表示了一些担忧——使用两套编译器就无法做LTO,更重要的是,两个编译器的微妙差异可能会导致内部ABI不兼容问题。还有人提出,应该考虑给GCC添加一个Rust前端。

多平台支持

Linux支持的体系结构众多,Rust暂时还不能全部覆盖。(主要是arc, sparc32)

不过这个问题可以用“先让一部分人Rust起来”的思路解决。

mrustc

除了把Rust代码编译成.o再跟C语言的目标文件链接在一起,还有一种可能是用mrustc把Rust代码翻译成C,再进行编译。

https://github.com/thepowersgang/mrustc

Linus Torvalds的态度

https://lkml.org/lkml/2020/7/10/1261

I’d want the first rust driver (or whatever) to be introduced in such a simple format that failures will be obvious and simple.

总结

所谓魔鬼都在细节之中。对内核项目来说,要引入一个新的语言并不容易。即使没有致命的问题,也需要投入很多的精力来排除一些障碍,让双语言开发被流畅的支持。如果Linux真的能够采纳Rust,那对整个Rust生态必将是一个巨大的利好消息。

最后,这次虽然更多的是一个主题讨论,不过还是有一份演讲的slides可以看的:

https://linuxplumbersconf.org/event/7/contributions/804/attachments/641/1168/barriers-to-in-tree-rust.pdf

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

  1. 腾讯回应“QQ 冻结”;高德上线“家人地图”惹争议;Linux 内核讨论引入 Rust 代码 | 极客头条

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 一分钟 ...

  2. 腾讯回应“QQ 冻结”;高德上线“家人地图”惹争议;Linux 内核讨论引入 Rust 代码| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...

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

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

  4. 为什么Linux内核里大量使用goto,而很多书籍却不提倡使用?

    关于C语言的goto语句存在很多争议,很多书籍都建议"谨慎使用,或者根本不用".Linux之父Linus在Linux中大量使用goto,也是在启示着我们可以合理使用goto语句. ...

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

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

  6. Rust布道者张汉东倾授,入门Rust初学者都要攻破哪些难点?

    摘要:Rust语言学习曲线过于陡峭?初学者看懂这张思维导图,快速入门. Rust语言这两年的热度大家有目共睹,作为一个有着突破性变革意义的语言,其光鲜背后也有诸多质疑,对于想要在系统编程语言上更上一层 ...

  7. Java并发编程71道面试题及答案

    Java并发编程71道面试题及答案 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方 ...

  8. Java并发编程75道面试题及答案

    1.在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User).任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bo ...

  9. Rust 编程有什么好?

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

最新文章

  1. C++中STL中的大、小、相等概念
  2. 远程教育中教师能力特点分析(转载)
  3. 【错误记录】MAC 存储空间 “其它“ 内容清理
  4. IT大佬整理的Python机器学习十大算法案例
  5. SAP 电商云 Spartacus UI 代码提交的 commit 信息规范
  6. 第二十七期:网络爬虫程序员被抓,我们还敢爬虫吗?细数那些Java爬虫技术
  7. SVG图片以 https 链接的方式展示在页面上,并且可继承父类的颜色大小(类似阿里巴巴iconfont)
  8. JDK15正式发布,新增功能预览!
  9. 一、python基本语法元素(温度转换)
  10. Html IECheckBox双击问题
  11. Cli4.5.x 中使用axios请求数据
  12. 【2016北京集训测试赛(八)】 直径 (虚树+树的直径)
  13. comsol固体传热_参与介质中辐射传热的 4 种计算方法
  14. redis、kafka、rabittMQ对比 (转)
  15. C#项目”XXXXX”针对的是”.NETFramework,Version=v4.7.1”但此计算机没有安装它
  16. dos命令之md详解及实例应用
  17. 苏教版六年级上册计算机教案,苏教版六年级数学上册最新全册教案
  18. (转)交替方向乘子法(ADMM)的原理和流程的白话总结
  19. 项目管理知识体系指南 (五)
  20. 1034 Head of a Gang

热门文章

  1. ABAP实例:一个现金流量表的代码
  2. 如何在SAP的Screen中编写List报表
  3. ALV GRID学习笔记----Double Click事件
  4. 解读百度Q4财报:智能云以三大关键词进位“第二引擎”,强势驱动百度未来
  5. 戴尔背书飞贷:创新IT技术直击金融机构互联网转型需求
  6. linux 远程 i o 错误,故意在Linux中导致I / O错误?
  7. a as as big rat_你知道填空中as的这个变态用法吗?
  8. 学校做计算机教室锐捷,锐捷云课堂:让学生爱上每一节课
  9. android广播面试题,Android相关面试题
  10. 计算机辅助教学导学设计研究,《计算机辅助教学》实验报告