<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux之父終于被勸動(dòng):用了30年的Linux內(nèi)核C語言將升級(jí)至C11

          共 1957字,需瀏覽 4分鐘

           ·

          2022-03-06 01:44

          來源:量子位 | 公眾號(hào) QbitAI

          還在使用89年版C語言的Linux內(nèi)核,現(xiàn)在終于要做出改變了。

          近日,Linux開源社區(qū)宣布,未來會(huì)把內(nèi)核C語言版本升級(jí)到C11,預(yù)計(jì)5.18版之后生效,也就是今年5月。

          這個(gè)決定很突然,從發(fā)起問題到官方聲明,不過才一個(gè)星期,要知道說服固執(zhí)的Linux之父?Linus Torvalds可不是件容易的事。

          事情的原因,說起來還有那么一點(diǎn)偶然的因素。

          一個(gè)bug的連鎖反應(yīng)

          問題的起源是來自上周的一次Linux社區(qū)討論。

          一位名叫Jakob Koschel的博士生,在研究阻止與內(nèi)核鏈表primitive相關(guān)的預(yù)測執(zhí)行漏洞時(shí),發(fā)現(xiàn)了這樣一個(gè)問題。

          Linux內(nèi)核廣泛使用由struct list_head定義的雙向鏈表:

          struct?list_head?{
          ????struct?list_head?*next,?*prev;
          ????};

          這種結(jié)構(gòu)通常嵌入到其他結(jié)構(gòu)中。通過這種方式,可以使用任何相關(guān)的結(jié)構(gòu)類型制作鏈表。

          除此之外,內(nèi)核還提供大量可用于遍歷和操作鏈表的函數(shù)和宏。list_for_each_entry()就是其中之一,這是偽裝成一種控制結(jié)構(gòu)的宏。

          問題就出在這個(gè)宏上。

          假設(shè)內(nèi)核包含如下結(jié)構(gòu):

          struct?foo?{
          ????????int?fooness;
          ????struct?list_head?list;
          ????};

          list中的元素可用于創(chuàng)建foo結(jié)構(gòu)的雙向鏈表。

          假設(shè)有一個(gè)叫做 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)中l(wèi)ist_head結(jié)構(gòu)的名稱。這個(gè)循環(huán)將為列表中的每個(gè)元素執(zhí)行一次, 迭代器指向該元素。

          由此導(dǎo)致了USB子系統(tǒng)中的一個(gè)bug:傳遞給該宏的迭代器在退出宏后還能被使用。

          這是一件危險(xiǎn)的事情,所以Koschel提交了一個(gè)修復(fù)補(bǔ)丁,在循環(huán)后停止使用迭代器搞定了bug。

          說服Linus

          但是Linus Torvalds本人并不太喜歡這個(gè)補(bǔ)丁,也沒有看到它與預(yù)測執(zhí)行漏洞的關(guān)系。在Koschel詳細(xì)解釋后,Linus承認(rèn)這只是一個(gè)普通的bug。

          然而事情并沒有那么簡單,Linus不久后意識(shí)到了真正的根源:

          傳遞給鏈表遍歷宏的迭代器,必須在循環(huán)本身之外的范圍內(nèi)聲明。

          這種非預(yù)測性bug發(fā)生的原因是,C89中沒有“在循環(huán)中聲明變量”。

          像list_for_each_entry()這樣的宏,從根本上總是將最后一個(gè)HEAD入口泄漏到循環(huán)之外,僅僅是因?yàn)槲覀儾荒茉谘h(huán)本身中聲明迭代器變量。

          如果可以編寫一個(gè)可以聲明自己的迭代器列表遍歷宏,那么迭代器在循環(huán)之外將不可見,并且不會(huì)出現(xiàn)此類問題。

          但是,由于內(nèi)核停留在C89標(biāo)準(zhǔn)上,因此無法在循環(huán)中聲明變量。

          Linus決定,那咱們還是升級(jí)吧,也許是時(shí)候轉(zhuǎn)向C99標(biāo)準(zhǔn)了。

          雖然它也有20多年的歷史,但至少比C89新,可以在循環(huán)中聲明變量。

          既然C89如此陳舊,這么多年還沒做出改變呢?Linus說,那是因?yàn)槲覀冊谝恍┕爬系膅cc編譯器版本中遇到了一些奇怪的問題,不能隨便升級(jí)。

          但是,現(xiàn)在Linux內(nèi)核已將gcc的最低要求提升至5.1版,因此過去那些奇怪的bug應(yīng)該不會(huì)有了。

          而另一位核心開發(fā)者Arnd Bergmann認(rèn)為,咱們完全可以升級(jí)到C11甚至更高版本。但如果升級(jí)到C17或C2x,會(huì)破壞對gcc-5/6/7的支持,因此升級(jí)到C11更容易實(shí)現(xiàn)。

          最終,Torvalds贊成這個(gè)想法:“好的,請?zhí)嵝盐遥屛覀冊?.18合并窗口的早期嘗試一下。”

          接下來遷移到C11可能會(huì)導(dǎo)致一些意想不到的bug,但如果一切順利,下一個(gè)Linus內(nèi)核版本將正式轉(zhuǎn)向C11。

          參考鏈接:
          [1]
          https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/
          [2]https://news.ycombinator.com/item?id=30459634

          僅供大家學(xué)習(xí)參考與知識(shí)傳播,版權(quán)歸原作者所有,如有侵權(quán),麻煩聯(lián)系進(jìn)行刪除,感謝~

          ???????????????? ?END ?????????????????


          瀏覽 68
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲色图欧洲 | 成人做爰A片一区二区app | 久久精品视频在线 | 蜜 桃 黄 片AV在线观看 91人妻人人澡人人爽人人精品 | 有码中文字幕第一页 |