ホームページ >システムチュートリアル >Linux >Linuxの父がついに説得:30年前のLinuxカーネルC言語はC11にアップグレードされる
最近嬉しいニュースがありましたが、これまで使用されてきた C 言語 Linux カーネルの 1989 年版がついにメジャーアップグレードされたということです。現代テクノロジーのペースは止まらず、本日、Linux オープンソース コミュニティは、カーネルの C 言語バージョンを C11 標準にアップグレードするという驚くべき計画を発表しました。この大規模な改革は、来る 5 月の Linux バージョン 5.18 以降に施行される予定です。この重要な動きは、Linux カーネルに無限の潜在的な機会をもたらし、Linux カーネルが最新のテクノロジーのニーズによりよく適応できるようにするでしょう。
この決定は突然でした。質問を開始してから公式声明が発表されるまで、わずか 1 週間しかかかりませんでした。Linux の頑固な父である Linus Torvalds を説得するのは簡単ではありません。事の原因はちょっとした偶然のようだ。 バグの連鎖反応Jakob Koschel という博士課程の学生は、カーネルのリンク リスト プリミティブに関連する予測実行の脆弱性の防止を研究しているときに、このような問題を発見しました。
Linux カーネルは、struct list_head で定義された二重リンク リストを広範囲に使用します: リーリー この構造は通常、他の構造内に埋め込まれます。このようにして、関連する構造タイプを使用してリンク リストを作成できます。
さらに、カーネルは、リンク リストの走査と操作に使用できる多数の関数とマクロも提供します。 list_for_each_entry () はその 1 つで、制御構造を装ったマクロです。問題はこのマクロにあります。カーネルに次の構造が含まれていると仮定します:
リーリーlist の要素を使用して、foo 構造体の二重リンクリストを作成できます。このようなリンク リストの先頭として宣言された foo_list という構造体があるとします。このリンク リストは次のコードを使用して走査できます:
リーリーlist 引数は、foo 構造内の list_head 構造の名前をマクロに伝えます。このループは、リスト内の要素ごとに 1 回実行され、反復子はその要素を指します。これにより、USB サブシステムにバグが発生しました。マクロに渡されたイテレータは、マクロの終了後も使用できる可能性がありました。
これは危険なことなので、Koschel はループ後の反復子の使用を停止することでバグを修正する修正を提出しました。
ライナスを説得するしかし、物事はそれほど単純ではありませんでした。Linus はすぐに真の根本原因に気づきました。リンク リスト トラバーサル マクロに渡されるイテレータは、ループ自体の外側のスコープで宣言する必要があるということです。この予測不能なバグは、C89 には「ループ内の変数の宣言」がないために発生します。
list_for_each_entry () のようなマクロは、基本的に常に最後の HEAD エントリをループの外にリークします。これは単純に、ループ自体でイテレータ変数を宣言できないためです。
自分自身を宣言できるイテレータ リスト トラバーサル マクロを作成できれば、イテレータはループの外側には表示されず、そのような問題は発生しません。ただし、カーネルは C89 標準に準拠しているため、ループ内で変数を宣言できません。
Linus は決断したので、アップグレードしましょう。C99 標準に移行する時期が来たのかもしれません。これも 20 年以上前のものですが、少なくとも C89 よりは新しく、ループ内で変数を宣言できます。
C89 は非常に古いものですが、なぜ何年も経っても変わらないのでしょうか? Linus 氏は、古い gcc コンパイラーのバージョンの一部で奇妙な問題が発生し、気軽にアップグレードできないためだと述べました。
ただし、現在、Linux カーネルは gcc の最小要件をバージョン 5.1 に引き上げているため、過去の奇妙なバグはもう存在しないはずです。もう 1 人のコア開発者である Arnd Bergmann は、C11 以上に確実にアップグレードできると信じています。ただし、C17 または C2x にアップグレードすると gcc-5/6/7 のサポートが終了するため、C11 にアップグレードする方が簡単です。
最終的に、Torvalds 氏はこのアイデアに同意しました:「わかりました、思い出してください。5.18 マージ ウィンドウの早い段階で試してみましょう。」次の C11 への移行はいくつかの予期せぬバグを引き起こす可能性がありますが、すべてがうまくいけば、次は A Linux カーネルのバージョンは正式に C11 に移行します。
以上がLinuxの父がついに説得:30年前のLinuxカーネルC言語はC11にアップグレードされるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。