Linus終於被勸動:用了30年的Linux核心C語言將升級
根據 核心郵件列表的訊息,社群近日討論了是否要為核心採用現代 C 語言標準。 |
雖然 Linux 核心在快速發展,但它同時依賴著一些非常古老的工具,其中之一就是核心程式碼仍在使用 1989 年版本的 C 語言標準——此標準在 30 多年前核心專案啟動之前就已經編寫完成。從討論結果來看,這一情況有望在 5.18 版本核心中改變。
Jakob Koschel 在向 Linus Torvalds 遞交的補丁 () 中修復了核心連結串列相關的預測執行漏洞。
起因是 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。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524109/viewspace-2904226/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 終於!“30 歲”的 Linux 核心 C 語言將升級到 C11Linux
- Linux核心C語言將升級LinuxC語言
- Linus Torvalds:Rust For Linux 或將被合併到 Linux 5.20 核心中RustLinux
- Linux核心升級Linux
- Linux核心筆記003 - Linux核心程式碼裡面的C語言和組合語言Linux筆記C語言組合語言
- C語言將資料表輸出到終端C語言
- Linus Torvalds接受來自微軟的Linux Hyper-V升級微軟Linux
- 2022年Rust將成為Linux核心第二語言RustLinux
- Linux-C語言LinuxC語言
- Ubuntu 16.04 升級Linux 系統核心UbuntuLinux
- 關於C語言的常量C語言
- C 語言程式碼風格之 Linux 核心程式碼風格Linux
- C++20語言核心特性的變化C++
- Linux 核心準備升級到 Rust 1.77LinuxRust
- Linux核心加入了Rust語言支援LinuxRust
- Freadhub終於升級Flutter2.0了Flutter
- 安全建議:將系統升級到Linux 5.4穩定版核心,很重要!Linux
- Linus Torvalds 宣佈新版Linux系統核心釋出Linux
- 麒麟核心升級
- 關於C語言的位運算子C語言
- 關於大數(C語言)C語言
- Linux下C語言編譯的問題LinuxC語言編譯
- 終於實現了一門屬於自己的程式語言
- C語言在linux終端下實現2048小遊戲:第二版C語言Linux遊戲
- CentOS 8 升級核心CentOS
- C語言關於多原始檔的呼叫C語言
- C# 利用.NET 升級助手將.NET Framework專案升級為.NET 6C#Framework
- 硬核觀察 #715 Linus 在 Macbook 上釋出了 Linux 核心 5.19MacLinux
- Linus 定義 LinuxLinux
- Linux下C語言驗證多程式LinuxC語言
- XPage系列|這次升級後終於是全自動化註冊了!
- 國產系統級程式語言與編譯器,輕鬆與 C 語言進行互動編譯
- CentOS 7 停服後(2024-06-30)升級最新的Linux 核心CentOSLinux
- Linus Torvalds釋出支援暢玩遊戲的Linux 5.16核心候選版本遊戲Linux
- C語言關於標頭檔案的使用C語言
- 基於C語言的Q格式使用詳解C語言
- 關於c語言輸入字串的總結C語言字串
- C語言與嵌入式C語言的區別C語言