7

Linus Torvalds计划将Linux内核迁移至现代C语言

 2 years ago
source link: http://dockone.io/article/2434881
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Linus Torvalds计划将Linux内核迁移至现代C语言

在此之前,Linux的内核基础为古老的C89标准;如今,Torvalds决定升级至2011年发布的、更为现代的C11标准。

大家都知道,Linux是由C语言编写而成。但各位可能不太了解,这里使用的是一种早已过时的C方言:C语言标准的1989年版本,即C89,也称ANSI X3.159-1989或ANSI C。Linus Torvalds当然知晓这一切,并决定将Linux的官方C版本更新至2011年发布的C11标准。

这次调整其实并不像听起来那么夸张,毕竟C89时至今日仍然拥有普遍支持。由于一切C编译器都能向下兼容早期版本,所以C89程序在编译或者运行上不会出现任何问题。换句话说,任何兼容C11的编译器都能顺利兼容C89遗留代码。

既然如此,干嘛还要费这个劲呢?理由也很简单,旧版本无法提供新版本中的很多实用功能。

这种情况当然引起了Torvalds的注意。当时有人打算修复内核链表primitive中预测执行函数的潜在安全问题,却发现补丁中存在另一个问题。在尝试修复时,Torvalds意识到在C89当中,传递给链表遍历宏的迭代器必须在循环本体之外的范围进行声明。

Torvalds随后写信给Linux内核邮件列表(LKML),认为“之所以会引发这种非预测性bug,原因就是C89当中根本不存在「循环声明变量」这种东西。正是因为无法在循环之内声明迭代器变量,list_for_each_entry() -这类宏在本质上总会把最后一个HEAD条目泄漏到循环以外。”

如何解决?把C89迁移至更新的C语言标准就能彻底消灭这类问题。所以,“是时候考虑转向C99标准了——虽然这项标准也已有20多年历史,但至少比C88更新、能够支持块级变量声明。”

Linux内核开发人员Arnd Bergmann认可这项计划的可行性,并补充称不如直接升级到2011年的C11标准。这主要是考虑到C99的流行度并不太高,而C11引入了标准化多线程支持并增强了安全性,所以最好能一步到位。

直上C11并不困难。就连Linux内核中的最小C编译器GCC 5.1都能够支持C11。这个理由说服了Torvalds,“这个问题已经酝酿了很多年,我真的很希望能迈出这一步。”

随后,在确保新的C标准能够在内核中正常工作之后,Torvalds决定按下“发射按钮”,表示“让我们在5.18合并窗口的早期尝试一下。”考虑到5.18合并窗口即将到来,所以最早可能在3月份就可能在内核中见到C11的身影。

但事情真能这么顺利吗?Linux内核开发人员兼记者Jonathan Corbet警告称,“千万要注意,在合并窗口与5.18发布之间可能会出现很多问题。语言标准版本的升级有可能在内核中某些不为人知的角落引发bug,所以必须尽早发现问题才能保证及时进行版本还原。但如果一切真的进展顺利,下一个Linux内核版本将正式转向C11。”

原文链接:Linus Torvalds prepares to move the Linux kernel to modern C

分享

2022-02-27


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK