新聞中心
雖然 Linux 內(nèi)核在快速發(fā)展,但它同時依賴著一些非常古老的工具,其中之一就是內(nèi)核代碼仍在使用 1989 年版本的 C 語言標(biāo)準(zhǔn)——此標(biāo)準(zhǔn)在 30 多年前內(nèi)核項目啟動之前就已經(jīng)編寫完成。從討論結(jié)果來看,這一情況有望在 5.18 版本內(nèi)核中改變。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比隨州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式隨州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋隨州地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
Jakob Koschel 在向 Linus Torvalds 遞交的補丁 (https://lkml.org/lkml/2022/2/17/1032) 中修復(fù)了內(nèi)核鏈表相關(guān)的預(yù)測執(zhí)行漏洞。
起因是 Jakob 發(fā)現(xiàn)了一個問題,Linux 內(nèi)核廣泛使用由 struct list_head 定義的雙向鏈表:
struct list_head {
struct list_head *next, *prev;
};這種結(jié)構(gòu)體通常被嵌入到其他結(jié)構(gòu)體中,通過這種方式,開發(fā)者可以使用任何感興趣的結(jié)構(gòu)類型制作鏈表。除此之外,內(nèi)核還提供了大量可用于遍歷和操作鏈表的函數(shù)和宏。其中之一是 list_for_each_entry(),這是一個偽裝成控制結(jié)構(gòu)的宏。要了解如何使用此宏,請假設(shè)內(nèi)核包含如下結(jié)構(gòu):
struct foo {
int fooness;
struct list_head list;
};list 成員可用于創(chuàng)建 foo 結(jié)構(gòu)體的雙向鏈表,假設(shè)我們有一個叫做 foo_list 的結(jié)構(gòu)聲明作為此類鏈表的頭,使用以下代碼可以遍歷此列表:
struct foo *iterator;
list_for_each_entry(iterator, &foo_list, list) {
do_something_with(iterator);
}
/* Should not use iterator here */
list 參數(shù)告訴宏在 foo 結(jié)構(gòu)中 list_head 結(jié)構(gòu)體的名稱。此循環(huán)將為列表中的每個元素執(zhí)行一次,迭代器指向該元素。由此導(dǎo)致了 USB 子系統(tǒng)中的一個 bug:傳遞給該宏的迭代器在退出宏后還能被使用。
Koschel 通過重新編寫有問題的代碼,以在循環(huán)后停止使用迭代器來解決問題。
不過 Linus 卻對補丁修復(fù)的問題表示不解,也沒有看到它與預(yù)測執(zhí)行漏洞的關(guān)系。Koschel 對此進(jìn)行了進(jìn)一步解釋,對此 Linus 認(rèn)為這只是一個普通的 bug。但不久之后 Linus 發(fā)現(xiàn)了問題的根源所在:傳遞給列表遍歷宏的迭代器,必須在循環(huán)本身之外的范圍內(nèi)聲明。
隨后,Linus 認(rèn)為也許可以采用更直接的修復(fù)如塊級變量聲明。但 C89 不支持,而 1999 年發(fā)布的 C99 標(biāo)準(zhǔn)支持。所以 Linux 內(nèi)核也許是時候轉(zhuǎn)向使用 C99 標(biāo)準(zhǔn)了。
Linus 說到,內(nèi)核代碼一直停留在 C89 的原因之一是編譯器 gcc 的舊版本會出現(xiàn)奇怪的問題,導(dǎo)致初始化程序被破壞。不過現(xiàn)在內(nèi)核要求的 GCC 最低版本已經(jīng)提高到了 v5.1,那些 bug 可能不再相關(guān)了。
另一位密切關(guān)注架構(gòu)編譯器問題的內(nèi)核開發(fā)者 Arnd Bergmann 提議直接升級到 C11 甚至 C2x,盡管他不確定 C11 是否會帶來任何對內(nèi)核有用的新內(nèi)容。不過如果升級到 C17 或 C2x,會破壞對 gcc-5/6/7 的支持,因此升級到 C11 更容易實現(xiàn),而且跨越太大內(nèi)核社區(qū)未必接受。
Linus 贊成了這個想法,在 Bergmann 確認(rèn)應(yīng)該可以這樣做之后,Linus 宣布將在下一個內(nèi)核版本 v5.18 中嘗試使用 C11 標(biāo)準(zhǔn)。如果一切順利,下一個內(nèi)核版本使用的 C 語言標(biāo)準(zhǔn)有望升級到 C11。
網(wǎng)站標(biāo)題:Linus終于被勸動:用了30年的Linux內(nèi)核C語言將升級
URL鏈接:http://www.dlmjj.cn/article/dhpsedg.html


咨詢
建站咨詢
