最近傳來消息,令人振奮的是,一直以來使用的1989年版C語言的Linux核心終於迎來了一次重大的升級。當代科技的腳步不可阻擋,今天,Linux開源社群宣布了一個引人注目的計劃,即將將核心的C語言版本提升至C11標準。根據預計,這項重大的改革將於Linux 5.18版本之後生效,也就是即將到來的五月。這項重要措施將為Linux核心帶來潛力無限的機遇,並促進其更好地適應現代化技術的需求。

這個決定很突然,從發起問題到官方聲明,不過才一個星期,要知道說服固執的 Linux 之父 Linus Torvalds 可不是件容易的事。事情的原因,說起來還有那麼一點偶然的因素。
一個bug的連鎖反應
問題的起源是來自上週的一次 Linux 社群討論。
一位名叫 Jakob Koschel 的博士生,在研究阻止與核心鍊錶 primitive 相關的預測執行漏洞時,發現了這樣一個問題。
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 提交了一個修復補丁,在循環後停止使用迭代器搞定了 bug。

說服Linus
但是 Linus Torvalds 本人不太喜歡這個補丁,也沒有看到它與預測執行漏洞的關係。在 Koschel 詳細解釋後,Linus 承認這只是一個普通的 bug。
然而事情並沒有那麼簡單,Linus 不久後意識到了真正的根源:傳遞給鍊錶遍歷宏的迭代器,必須在循環本身之外的範圍內聲明。這種非預測性 bug 發生的原因是,C89 中沒有「在迴圈中宣告變數」。
像 list_for_each_entry () 這樣的宏,從根本上總是將最後一個 HEAD 入口洩漏到循環之外,僅僅是因為我們不能在循環本身中聲明迭代器變數。
如果可以編寫一個可以聲明自己的迭代器列表遍歷宏,那麼迭代器在循環之外將不可見,並且不會出現此類問題。但是,由於核心停留在 C89 標準上,因此無法在循環中聲明變數。
Linus 決定,那咱們還是升級吧,也許是時候轉向 C99 標準了。雖然它也有 20 多年的歷史,但至少比 C89 新,可以在循環中聲明變數。
既然 C89 如此陳舊,這麼多年還沒做出改變呢? Linus 說,那是因為我們在一些古老的 gcc 編譯器版本中遇到了一些奇怪的問題,不能隨便升級。

但是,現在 Linux 核心已將 gcc 的最低要求提升至 5.1 版,因此過去那些奇怪的 bug 應該不會有了。
而另一位核心開發者 Arnd Bergmann 認為,咱們完全可以升級到 C11 甚至更高版本。但如果升級到 C17 或 C2x,會破壞對 gcc-5/6/7 的支持,因此升級到 C11 更容易實現。
最終,Torvalds 贊成這個想法:「好的,請提醒我,讓我們在5.18 合併視窗的早期嘗試一下。」接下來遷移到C11 可能會導致一些意想不到的bug,但如果一切順利,下一個Linux 核心版本將正式轉向C11。
以上是Linux 之父終於被說服:用了 30 年的 Linux 核心 C 語言將升級至 C11的詳細內容。更多資訊請關注PHP中文網其他相關文章!

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

端口映射又称端口转发,是指将外部主机的IP地址的端口映射到Intranet中的一台计算机,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上;可以通过使用动态或固定的公共网络IP路由ADSL宽带路由器来实现。

在linux中,交叉编译是指在一个平台上生成另一个平台上的可执行代码,即编译源代码的平台和执行源代码编译后程序的平台是两个不同的平台。使用交叉编译的原因:1、目标系统没有能力在其上进行本地编译;2、有能力进行源代码编译的平台与目标平台不同。

在linux中,eof是自定义终止符,是“END Of File”的缩写;因为是自定义的终止符,所以eof就不是固定的,可以随意的设置别名,linux中按“ctrl+d”就代表eof,eof一般会配合cat命令用于多行文本输出,指文件末尾。

在linux中,可以利用“rpm -qa pcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。

linux查询mac地址的方法:1、打开系统,在桌面中点击鼠标右键,选择“打开终端”;2、在终端中,执行“ifconfig”命令,查看输出结果,在输出信息第四行中紧跟“ether”单词后的字符串就是mac地址。

在linux中,rpc是远程过程调用的意思,是Reomote Procedure Call的缩写,特指一种隐藏了过程调用时实际通信细节的IPC方法;linux中通过RPC可以充分利用非共享内存的多处理器环境,提高系统资源的利用率。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器