社区编辑申请
注册/登录
Linus终于被劝动:用了30年的Linux内核C语言将升级
系统 Linux 后端
根据 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 定义的双向链表:

struct list_head {

struct list_head *next, *prev;

};

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

struct foo {

int fooness;

struct list_head list;

};

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。

责任编辑:庞桂玉 来源: C语言与C++编程
相关推荐

2022-06-20 22:37:25

Linux操作系统命令

2022-02-25 14:51:39

LinuxC语言Linux 内核

2022-06-15 08:21:49

Linux运维工程师

2022-06-07 10:09:42

新技术人工智能5G

2022-06-16 17:02:49

微软智能云混合云Azure

2022-05-05 09:27:31

Linux服务器优化

2022-06-05 08:12:56

LinuxLinux Lite浏览器

2022-06-21 09:26:21

Shell脚本JavaScript

2022-05-14 08:05:18

Linux内存管理

2022-05-18 10:58:36

LinuxKali Linux

2022-06-06 10:20:59

CPUCPU 使用率CPU 负载

2022-06-27 09:54:38

编程语言JavaC++

2022-04-12 08:22:54

Linux内核操作系统

2022-06-10 07:45:09

CentOS国产操作系统

2022-06-01 10:09:39

Linux网络延迟

2022-05-23 13:17:32

Linux开源NVIDIA

2022-06-28 10:03:56

CentOSLinux

2022-06-19 14:13:29

tmateLinux

2022-06-22 09:19:55

HDC鸿蒙ADB命令

2022-06-07 09:59:21

网络安全安全漏洞

同话题下的热门内容

用这些开源工具在 Linux 上编辑 PDF 文件Linux 网络性能的 15 个优化建议Docker Compose:搭建开发环境的好方式在 Linux 上玩电子游戏的三种方式为什么命令行在 Linux 生态系统中如此重要Docker 暴重大安全漏洞:外部网络可直接访问映射到 127.0.0.1 的本地服务Linux 之父发话:Rust 将合并到 Linux 5.20 内核中去CentOS 替代方案:AlmaLinux 构建系统向所有人开放

编辑推荐

Linux系统下安装MySQL的步骤详解CentOS与Ubuntu有什么不同?Linux下如何使用minicom USB串口为什么你可能想要略过Ubuntu 17.04?Linux中7个判断文件系统类型的方法
我收藏的内容
点赞
收藏

51CTO技术栈公众号