美文网首页
Linux内核C语言将升级

Linux内核C语言将升级

作者: 老率的IT私房菜 | 来源:发表于2022-03-17 00:24 被阅读0次

根据 Linux 内核邮件列表的消息,社区近日讨论了是否要为内核采用现代 C 语言标准。

虽然 Linux 内核在快速发展,但它同时依赖着一些非常古老的工具,其中之一就是内核代码仍在使用1989年版本的 C 语言标准——此标准在30多年前内核项目启动之前就已经编写完成。从讨论结果来看,这一情况有望在5.18版本内核中改变。

Jakob Koschel 在向 Linus Torvalds 递交的补丁(https://lkml.org/lkml/2022/2/17/1032)中修复了内核链表相关的预测执行漏洞。

起因是 Jakob 发现了一个问题,Linux 内核广泛使用由 struct list_head 定义的双向链表:

structlist_head{ structlist_head*next,*prev;};

这种结构体通常被嵌入到其他结构体中,通过这种方式,开发者可以使用任何感兴趣的结构类型制作链表。除此之外,内核还提供了大量可用于遍历和操作链表的函数和宏。其中之一是 list_for_each_entry(),这是一个伪装成控制结构的宏。要了解如何使用此宏,请假设内核包含如下结构:

structfoo{intfooness;structlist_headlist;};

list 成员可用于创建 foo 结构体的双向链表,假设我们有一个叫做 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 子系统中的一个 bug:传递给该宏的迭代器在退出宏后还能被使用。

Koschel 通过重新编写有问题的代码,以在循环后停止使用迭代器来解决问题。

不过 Linus 却对补丁修复的问题表示不解,也没有看到它与预测执行漏洞的关系。Koschel 对此进行了进一步解释,对此 Linus 认为这只是一个普通的 bug。但不久之后 Linus 发现了问题的根源所在:传递给列表遍历宏的迭代器,必须在循环本身之外的范围内声明。

随后,Linus 认为也许可以采用更直接的修复如块级变量声明。但 C89不支持,而1999年发布的 C99标准支持。所以 Linux 内核也许是时候转向使用 C99标准了。

Linus 说到,内核代码一直停留在 C89的原因之一是编译器 gcc 的旧版本会出现奇怪的问题,导致初始化程序被破坏。不过现在内核要求的 GCC 最低版本已经提高到了 v5.1,那些 bug 可能不再相关了。

另一位密切关注架构编译器问题的内核开发者 Arnd Bergmann 提议直接升级到 C11甚至 C2x,尽管他不确定 C11是否会带来任何对内核有用的新内容。不过如果升级到 C17或 C2x,会破坏对 gcc-5/6/7的支持,因此升级到 C11更容易实现,而且跨越太大内核社区未必接受。

Linus赞成了这个想法,在 Bergmann确认应该可以这样做之后,Linus宣布将在下一个内核版本 v5.18中尝试使用 C11标准。如果一切顺利,下一个内核版本使用的 C 语言标准有望升级到 C11。

相关文章

  • Linux内核C语言将升级

    根据Linux[https://www.linuxprobe.com/]内核邮件列表的消息,社区近日讨论了是否要为...

  • 【Linux】 Linux CentOS yum 方式内核升级

    内核升级解决Linux内核漏洞,一般Linux内核升级存在两种方式,一种将新版内核下载到服务器上,手动编译,适合高...

  • 0基础自学linux运维-5.7-C语言IDE CLion远程L

    说明 有时候我们学习linux内核,linux内核用的是C写的,或者我们想练习一下 C语言,跑linux,一般不建...

  • Linux kernel特权提升漏洞复现(CVE-2021-34

    0x00简介 linux kernel一般指Linux内核。Linux是一种开源电脑操作系统内核。它是一个用C语言...

  • Linux内核开发必读书目,从菜鸟到大牛必备

    学完C语言之后,最终是要应用到某个领域的,比如后端开发,应用开发或者Linux内核开发等。本文将介绍一下Linux...

  • GNU C语法扩展(3)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(5)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C 扩展(2)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(4)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C的语法扩展(1)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

网友评论

      本文标题:Linux内核C语言将升级

      本文链接:https://www.haomeiwen.com/subject/ukgmdrtx.html