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

时间:2022-10-09 17:15:37 | 浏览:2698

整理 | 章雨铭 责编 | 屠敏出品 | CSDN(ID:CSDNnews)上周《LINUX设备驱动程序第三版》的第一作者、LWN网络杂志创始人兼主编Jonathan Corbet发表了对于Linux内核的一些看法,他认为虽然内核项目总体发

整理 | 章雨铭 责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

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

是的,没错,拥有30年历史的Linux内核C语言要升级了。Linux开源社区已经宣布,2022年五月将把内核C语言版本升级到C11。

源于一次补丁,Linux内核缺陷显现

这一决定很迅速,从问题发起到官方拍板宣布用时短短一周。

这一提案要从 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重写了相关代码,循环后不再需要通过迭代器解决问题。

Linus拍板:Linux内核C语言将升级为C11

事实上,Linux内核的发明人及该计划的合作者Linus Torvalds开始对于这一补丁并不感冒,也不理解它和预测执行漏洞的关系。

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

这种非投机性错误之所以会发生,是因为我们在历史上没有C99风格的"在循环中声明变量"。所以list_for_each_entry——以及所有其他的——往往会将最后一个HEAD条目从循环中泄露出来,仅仅是因为我们无法在循环本身中声明迭代器变量。

如果有可能编写一个可以声明自己的迭代器的列表遍历宏,那么这个迭代器在循环之外是不可见的,就不会出现这种问题。但是,由于内核停留在C89标准上,在循环中声明变量是不可能的。

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

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

不过,转移到C11将不需要改变GCC的最低版本,因此可能更容易做到。Torvalds对这个想法表示赞同,并且希望最终能够取得成果。在Bergmann确认这可行之后,Torvalds宣布在5.18合并窗口进行早期尝试。

值得注意的是,在合并窗口和5.18版本之间可能发生很多事情。迁移到新版本的语言标准,可能导致内核中一些不明显的地方出现小bug,而往往一个小小的bug就有可能导致现在的改变被撤销。但是,如果一切顺利的话,下一个内核版本就可能会被正式迁移到C11上。将list_for_each_entry的所有用户和变种(在内核中有超过15,000个)转换为不暴露内部迭代器的新版本,不过这可能要花不少时间。

你对这次升级有什么看法呢,你觉得升级后会带来什么改变?欢迎大家在下方留言!

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

—END—

《新程序员001-004》全面上市,对话世界级大师,报道中国IT行业创新创造

相关资讯

价值过亿的十件现代艺术

亚洲艺术新闻CANS 2020全球藝術品拍賣成交十大排行 Top 8中國藝術品 Top 4 / 2020西畫 Top 1 / 2020 廿世紀華人 Top 1常玉〈綠色背景四裸女〉油彩 纖維板S 蘇富比 2020/07/08 Lot 102

投资近百亿!岐江新城终于有新动态了!两条主干道提上日程

作为中山城市新中心,岐江新城的一举一动都备受关注。  2019年11月22日,据中山市公共资源交易中心公告,东明桥至中江高速出入口快速化改造工程进入第二次勘察阶段。同时,片区另一交通改造项目——世纪大道快速化工程也开始勘察设计招标。  两

终于等到你!德阳人民的环湖公交要来了

德阳的第一条专属于旌湖线路的公交车要上线了。曾经,德阳最拉风的公交车是什么?一定是1路的双层巴士。2006年4月16日,德阳上线的双层巴士只投放在了1路公交线上,那个时候的票价还只是1元钱。每次等1路公交车的时候,都很希望到站的是一辆双层巴

江山(现代诗)

江山是千里冰封,万里雪飘,引无数英雄竞折腰的江山是青山叠翠,稻菽千顷,湖沼密布水网织的江山是北京山顶洞走出华夏始祖的江山是贾湖人盖起人类第一间房子,播下第一粒种子驯养第一头牲畜,刻出第一枚骨笛的江山是炎黄二帝,开疆拓土,采草药于深山野岭,抚

力争2025年第三产业占比85%以上黄石港区:争创全国现代服务业试验区

黄石港区政府近日作出决定,把发展现代服务业摆在经济工作的重要位置,争创全国现代服务业试验区。力争到2025年,第三产业占比达85%以上。作为中心城区的黄石港,随着城市经济结构发生的变化,服务业已成为全区的主要经济支柱。早在几年前,黄石港区就

端牢中国饭碗的"郾城答卷"——漯河市郾城区"百年荣光 行走郾城 "之现代农业篇

文、图/王中山 张帆五月的沙澧大地,暖日菜心稠,晴烟麦穗抽,一片丰收景象。5月19日,由漯河市郾城区委宣传部、郾城区文联组织开展的"百年荣光 行走郾城 "活动,邀请部分媒体记者、摄影家爱好者、文学和艺术工作者,对郾城区现代农业观摩考察。漯河

专家:信用体系建设是提高治理现代化的重要抓手

央视网消息(记者 谢博韬刘亮):8月28日,“经济特区40年@治理现代化”网络主题宣传活动的记者们来到厦门,调研采访过程中走进国家信用大数据创新中心、国家信息中心大数据开放应用(厦门)基地。新冠疫情尽管给经济带来重大影响,但也催生了不少新机

台长不断尝试,三年之后,终于在阳台上种出了文玩葫芦!

文玩葫芦文玩葫芦,台友你玩过吗?不管是公园、旅游区,文玩古玩集市,还是花鸟盆景市场,都很容易见到这玩意。额,价格也不贵,一般掌上大小的,价格就在5~10块钱一个吧。市场上各种形状的葫芦都有,究竟是规正、完美的葫芦形状好看,还是稀奇古怪、花里

为什么高度近视的人不能献血?看完之后,终于明白了

大家是不是在电视上或者电影中遇到在医院中输血的场景?由于发生事故造成创伤出现大量出血,这时候就需要输血来补充病人所缺失的血液了。但是血液也分很多种,如果遇到稀有的“熊猫血”就得找到相同血型的“熊猫血”。所以国家《献血法》在1998年实行无偿

快速恢复视力--如何在现代电子环境下保持清晰视力

快速恢复视力--如何在现代电子环境下保持清晰视力前言:注意用眼卫生,环境光线充足,及时远眺休息。饮食多注意补充维生素,看书阅读姿势正确。“眼睛是心灵的窗户”,使用电子智能产品虽说是容易令人着迷,但对于我们来说,眼睛和视力才是根本,没有好视力

友情链接

天天财经元宇宙中国SEO域名抢注宝宝起名网网站监控苏州旅游网瑞士旅游网三明今日新闻网昆明旅游网崇左新闻资讯网泉州新闻资讯网揭阳新闻资讯网湖南旅游网伊利股份A股攀枝花今日新闻网澳洲进口奶粉代购瘦身减肥训练营原油期货网今日青岛葡萄牙旅游网创业板股票指数芬兰旅游网今日忻州青岛旅游网富士山旅游网养生知识网火锅店加盟网官网吉安新闻头条网信用卡申请中心柳州新闻资讯网邵阳新闻头条网图阿普塞旅游网益阳头条新闻网珠海头条新闻网姿佳女性健康官网
c语言中文官网-零基础c++从入门到精通pdf、c语言编译器、C/C++开发工具、c语言入门自学零基础、c++入门自学、c/c++软件下载、c语言编程软件、c语言自学免费网站、c语言零基础自学视频教程、c++手机编程软件、c语言入门程序设计、初级编程视频教程、c语言在线编程平台、C语言线上作业网站。
c语言中文官网 chuxinxin.cn©2022-2028版权所有