资讯详情

终于升级?89年的Linux内核C语言“跟上时代”转成现代C

caf894aed00f5f646812d38a9d8013d8.gif

整理 | 章雨铭 责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

上周《LINUX第三版设备驱动程序的第一作者,LWN网络杂志创始人兼主编Jonathan Corbet发表了对于Linux他认为,虽然核项目整体发展迅速,但核代码仍采用1989年版本的C语言标准,而5.这种情况可能会结束这种情况。

是的,是的,有30年历史的Linux升级内核C语言。Linux开源社区年5月,开源社区宣布将升级内核C语言版本C11。

这个决定很快就做出了,从问题开始到官方决定宣布需要一个星期。

从这个提案开始 Linux 内核贡献者Jakob Koschel说到补丁系列。

他在研究阻止与内核链表primitive在实施相关预测漏洞时,发现了这样的问题。Linux大量使用内核的原因struct list_head双链表的定义。

struct list_head {   struct list_head *next, *prev;     };

这种结构通常嵌入到其他一些结构中。这样,任何相关的结构类型都可以创建链表。随着类型的出现,核心提供了大量的函数和宏,可以用遍历和操作链表。其中之一list_for_each_entry(),它是一个伪装成控制结构的宏。内核包括以下结构:

struct foo {       int fooness;   struct list_head list;     };

list中间元素可以用来创建一个原因foo由结构组成的双链列表;单独list_head结构通常被视为这个列表的开头,假设有一个叫做foo_list列表。此列表可以使用以下代码遍历。

struct foo *iterator;         list_for_each_entry(iterator, &foo_list, list) {       do_something_with(iterator);     }     /* Should not use iterator here */

list参数告诉宏在foo结构中的list_head结构名称。本循环将执行迭代器指向列表中的每个元素。

但这样USB子系统中会出现错误,退出宏后仍可使用传递给宏的迭代器,这是一件非常危险的事情。Koschel提交补丁修复错误。根据列表中发生的情况,即使没有预测执行,迭代器的内容也可能出人意料。Koschel重写相关代码,循环后不再需要通过迭代器解决问题。

事实上,Linux该计划的发明人和合作伙伴Linus Torvalds一开始,我对这个补丁不感冒,也不理解它与预测执行漏洞的关系。

不过,在Koschel在进一步解释情况后,Torvalds认同"这只是一个常规错误,简单明了"。但后来他谈到了问题的真正根源:传递给列表遍历宏的迭代器必须在循环本身以外的范围内声明。

这种非投机性错误发生的原因是我们在历史上没有C99风格的"在循环中声明变量"。所以list_for_each_entry()-以及所有其他的-通常是最后一个HEAD由于我们不能在循环本身中声明迭代器变量,条目从循环中泄露出来。

如果有可能在历宏编写一个可以声明其迭代器的列表,则该迭代器在循环之外是看不见的,则不会出现此问题。然而,由于核心仍然存在C在89标准中,不可能在循环中声明变量。

Torvalds也许是时候考虑转向了C99标准是时候了——虽然已经有20多年的历史了,但它仍然是最新版本,足以允许块级变量声明。正如他所指出的,过去没有这样做的原因,"因为我们在一些古老的地方gcc版本中遇到了一些破坏文件初始化器的问题"。但与此同时,核心已经把它降到了最低水平GCC要求移到了5.版本,所以也许这些错误并不重要。

Linux内核的开发者Arnd Bergmann他也同意这一观点,认为核心有可能向前发展。事实上,他建议有可能在改变的同时实现C尽管他不确定11标准(从2011年开始)C11是否会带来对核心有用的新东西。甚至有可能转移C17甚至还没有完成C2x语言的版本。然而,也有一个问题,那就是"会破坏对gcc-5/6/7的支持",内核仍然支持这些版本。将GCC最低版本提高到8.x,目前用户社区愿意接受的版本可能会有很大的差距。

但是,转移C11不需要改变GCC最低版本可能更容易做到。Torvalds同意这个想法,希望最终取得成果。Bergmann确认这是可行的,Torvalds宣布在5.早期尝试合并窗口。

值得注意的是,合并窗口和5.版本之间可能会发生很多事情。迁移到新版本的语言标准可能会导致核心中一些不明显的地方出现小的情况bug,通常是小的bug现在的变化可能会被撤销。但是,如果一切顺利,下一个核心版本可能会正式迁移到C11上。将list_for_each_entry()所有用户和变种(内核中有1.5万多个)转换为新版本,不暴露内部迭代器,但可能需要很多时间。

你觉得升级后会带来什么变化?欢迎在下面留言!

参考资料:https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/

—END—

— 推荐阅读 —

?苹果公开第三方支付,曝光华为新成立十大预备军团;GitLab 14.8发布 | 极客头条 ?那个名为 XROS 元宇宙浪潮中的操作系统! ?“兼职开发的程序员,为什么不受企业待见?”

标签: 二极管pk25f

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台