上遊Linux 開發者反對"-O3"級別的內核優化

2020-12-16 開源中國

WireGuard 作者 Jason A. Donenfeld 上周向 Linux 內核提交了一個補丁,他建議在使用新發布的 GCC 10 編譯器或更高的版本時,將內核的默認編譯優化級別由 -O2 設置為 -O3。

Jason 解釋道,GCC 10 對 -O2 進行了改進,以便在使用 -flto 時縮短編譯時間,不過這似乎是以犧牲性能為代價來實現的。而現在的 -O3 優化不存在和 10 年前同樣的 bug,所以當 gcc >= 10 時,他提交的補丁會將 Linux 內核的編譯優化默認設置為 -O3 級別。

對於這個提交,部分開發者表示有興趣支持 -O3 優化級別的子集功能,甚至探索 -Og 級別的優化,並努力縮短構建內核花費的時間,以便於測試。

不過總體看來,將內核默認編譯優化級別設置為 -O3 的提案遭到了廣泛的反對,因為這不一定會讓內核變得更快,反而有可能會引入因優化而導致出現的特殊特性,甚至會產生讓代碼變得更慢的地方。

Linus Torvalds 也進行了表態,他不認為這是一個明智的想法,尤其是 GCC -O3 級別的優化有時會導致出現問題。

GCC 開發者 Richard Biener 也寫道,他不建議在內核中使用 -O3 級別的優化。他曾經提出使用 feedback/profile-driven 的數據讓編譯器做出更好優化決策的想法,但這會是一個非常龐大的任務,需要為 FDO 收集到足夠的數據才能體會到方便之處。

因此,至少目前來看,Linux 內核似乎不會追求這種更具侵略性、更激進的編譯器優化級別。

相關焦點

  • Linux 系統內核的調試
    但是,Linux 系統的開發者出於保證內核代碼正確性的考慮,不願意在 Linux 內核原始碼樹中加入一個調試器。他們認為內核中的調試器會誤導開發者,從而引入不良的修正[1]。所以對 Linux 內核進行調試一直是個令內核程式設計師感到棘手的問題,調試工作的艱苦性是內核級的開發區別於用戶級開發的一個顯著特點。
  • Linux內核啟動-內核解壓縮
    本文引用地址:http://www.eepw.com.cn/article/148792.htm從內核的生成過程來看內核的連結主要有三步:第一步是把內核的原始碼編譯成.o文件,然後連結,這一步,連結的是arch/i386/kernel/head.S,生成的是vmlinux。
  • 嵌入式Linux內核啟動主要分為這三個階段
    一、Linux內核自解壓過程  在linux內核啟動過程中一般能看到圖1內核自解壓界面,這裡重點討論內核的自解壓過程。  內核壓縮和解壓縮代碼都在目錄kernel/arch/arm/boot/compressed,編譯完成後將產生head.o、misc.o、piggy.gzip.o、vmlinux、decompress.o這幾個文件,head.o是內核的頭部文件,負責初始設置;misc.o將主要負責內核的解壓工作,它在head.o之後;piggy.gzip.o是一個中間文件,其實是一個壓縮的內核(kernel
  • Linux 內核學習:環境搭建和內核編譯
    內核學習之一:環境搭建--安裝Debian7.3本系列文章假設讀者已對linux有一定的了解,其實學習linux內核不需要有很深的關於linux的知識,只需要了解以下內容:linux基礎知識及基本shell命令;現代作業系統的基本概念;C語言和gcc基本使用。
  • 英特爾發布 Clear Linux 開發者版本
    英特爾近日發布了專為開發者打造的 Clear Linux 版本。Clear Linux 追求在英特爾®架構上具有最佳性能,為開發者提供實用工具及工作流程,從而加速軟體開發工作的進行。
  • linux-3.18內核系統調用
    否則,如果某個用戶應用試圖調用這些已經被淘汰的系統調用,所得到的結果,比如打開了一個文件,就會與預期完全不同,這將令人感到非常奇怪。其實,sys_ni_syscall中的"ni"即表示"not implemented(沒有實現)"。
  • Linux內核學習:簡單的字符設備驅動
    Linux內核設備驅動架構如下圖所示,Linux內核針對上述3類設備抽象出來一套完整的驅動框架和API接口,以便驅動開發者在編寫某類設備驅動時可重複使用。字符設備是以字節為單位的I/O傳輸,這種字符流的傳輸率通常比較低。
  • Linux 內核通知鏈和例程代碼
    為了滿足這個需求,也即是讓某個子系統在發生某個事件時通知其它的子系統,Linux內核提供了通知鏈的機制。通知鍊表只能夠在內核的子系統之間使用,而不能夠在內核與用戶空間之間進行事件的通知。通知鍊表是一個函數鍊表,鍊表上的每一個節點都註冊了一個函數。當某個事情發生時,鍊表上所有節點對應的函數就會被執行。所以對於通知鍊表來說有一個通知方與一個接收方。
  • linux配置、編譯內核實用工具
    2.配置文件.config  執行「make 」會在根目錄下生成該配置文件,其內容記錄了具體的配置選擇,也可以將舊內核的配置文件放在這裡。  3.arch/*/Makefile  這是與特定體系結構相關的Makefile。它包含在根目錄下的Makefile中,為kbuild提供體系結構的特定信息。
  • Linux內核概述
    μClinuxμClinux 是一種優秀的嵌入式 Linux 版本,其全稱為 micro-control Linux,從字面意思看是指微控制 Linux。同標準的 Linux 相比,μClinux 的內核非常小,但是它仍然繼承了 Linux 作業系統的主要特性,包括良好的穩定性和移植性、強大的網絡功能、出色的文件系統支持、標準豐富的 API,以及 TCP/IP 網絡協議等。因為沒有 MMU 內存管理單元,所以其多任務的實現需要一定技巧。
  • Linux2.6內核驅動移植參考
    作者:晏渭川 隨著Linux2.6的發布,由於2.6內核做了教的改動,各個設備的驅動程序在不同程度上要 進行改寫。為了方便各位Linux愛好者我把自己整理的這分文檔share出來。該文當列舉 了2.6內核同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個 函數的用法。
  • Linux內核編譯初體驗
    下載內核在ftp://ftp.kernel.org/pub/linux/kernel/下載原版內核本文引用地址:http://www.eepw.com.cn/article/201611/319326.htm此處使用linux-2.6.22.6.tar.bz22.
  • Linux 內核的測試和調試(6)
    如果補丁涉及到其他架構,你需要交叉編譯然後測試一下。請通過下面的目錄查找測試工具:如果你對你的補丁測試結果感到很滿意,你就可以提交補丁了。請確保提交 commit 的信息要描述得非常清楚。要讓內核維護者和其他開發者看懂補丁所修改的內容,這一點非常重要。
  • linux內核啟動流程
    Linux內核啟動及文件系統加載過程   當u-boot開始執行bootcmd命令,就進入Linux內核啟動階段,與u-boot類似,普通Linux內核的啟動過程也可以分為兩個階段,但針對壓縮了的內核如uImage就要包括內核自解壓過程了。本文以linux-2.6.37版源碼為例分三個階段來描述內核啟動全過程。
  • 在21世紀該怎樣編譯Linux內核
    內核開發者、硬體製造商、技術支持和愛好者都知道新的硬體會不斷地發布。它們大多數都會貢獻驅動程序,直接提交給內核開發團隊以包含在 Linux 中。例如,英偉達顯卡驅動程序通常都會寫入 Nouveau 內核模塊中,並且因為英偉達顯卡很常用,它的代碼都包含在任一個日常使用的發行版內核中(例如當下載 Fedora 或 Ubuntu 得到的內核)。
  • Linus 「警告」內核開發者不要在聖誕節前夕提交代碼
    Linus 「警告」內核開發者不要在聖誕節前夕提交代碼 近日,Linus Torvalds 發布了 Linux 內核的 5.10 版本,並為下一個版本 5.11 設置了一個聖誕節前的提交截止日期,逾期提交的代碼將很有可能延後到明年合併,表達了自己「強烈的放假欲望」。
  • 深入理解Linux內核鍊表
    在Linux內核中使用了大量的鍊表結構來組織數據,包括設備列表以及各種功能模塊中的數據組織。這些鍊表大多採用在[include/linux/list.h]實現的一個相當精彩的鍊表數據結構。本文的後繼部分就將通過示例詳細介紹這一數據結構的組織和使用。
  • Ubuntu中升級Linux內核
    ●支持ARCv2和HS38 CPU內核  ●增加了隊列自旋鎖的支持  ●許多其他的改進和驅動更新。  在Ubuntu中如何下載4.2內核:  此內核版本的二進位包可供下載連結如下:  Download Kernel 4.2 (.DEB)  首先檢查作業系統類型,32位(i386)的或64位(amd64)的,然後使用下面方式依次下載並安裝軟體包:  1.linux-headers-4.2.0-xxx_all.deb
  • 嵌入式Linux啟動時間優化的秘密之一工具鏈/應用程式優化
    參見https://elinux.org/Grabserial   3. 工具鏈優化   3.1 從工具鏈入手   選擇使用合適的工具鏈,應是第一個入手點,因為所有的運行加載固件都是由工具鏈編譯而成。如果尚未進行其他優化,則更改工具鏈的好處將更加明顯,並且更容易度量。
  • 29 年過百萬次 commit,Linux 內核何以發展至今?
    繁雜且自成體系的內核代碼首個內核版本 linux-0.01.tar.Z 由 88 個文件和 10,239 行代碼組成,運行在 i386 這樣單一的硬體架構上。到了 5.8 版本,這一數據擴張為 69,325 個文件和 28,442,673 行代碼,並能夠在 30 多種主要的架構上運行。