Linux核心源程式的部分特點(轉)
Linux核心源程式的部分特點(轉)[@more@]原作者:flywings
Linux核心同時使用C語言和組合語言來實現。這兩種語言需要一
定的平衡:C語言編寫的程式碼移植性較好,易於維護,而組合語言編寫
的程式則速度較快。一般只有在速度是關鍵因素或者一些因平臺相關
特性而產生的特殊要求(例如直接和記憶體管理硬體進行通訊)時才採
用匯編語言。
實際上,即使核心並未採用C++的物件特性,部分核心也可以在g++
(GNU的C++編譯器)下進行編譯。同其他物件導向的程式語言相比較,
相對而言C++的開銷是較低的,但是對核心開發人員來說,這已經是太
多了。
1、gcc特性的使用
Linux核心被設計為必須使用GNU的C編譯器gcc來編譯,而不是任何
一種C編譯器都可以使用。核心程式碼有時要使用gcc特性。
一些gcc特有程式碼只是簡單地使用gcc語言擴充套件,例如允許在C(不
只是C++)中使用inline關鍵字指示行內函數。也就是說,程式碼中被調
用的函式在每次函式呼叫時都會被擴充,因而就可以節約實際函式呼叫
的開銷。
一般情況下,程式碼的編寫方式比較複雜。因為對於某些型別的輸入
,gcc能夠產生比其他輸入效率高的執行程式碼。從理論上講,編譯器可
以最佳化具有相同功能的兩種對等的方法,並且得到相同的結果。因此,
程式碼的編寫方式是無關緊要的。但是在實際中,用某種方法編寫所產生
的程式碼要比用另外一些方法編寫所產生的程式碼執行速度上快許多。核心
開發人員知道怎樣才能產生更高效的執行程式碼,這不斷地在他們編寫的
程式碼中反映出來。
例如,考慮核心中經常使用的goto語句--為了提高速度,核心中經
常大量使用這種一般要避免使用的語句。整個核心的比例大概是每260
行一個goto語句,比例如此高的原因是核心源程式的核心,在這裡速度
比其他因素都需要優先考慮。
2、核心程式碼習慣用語
核心程式碼中使用了一些顯著的習慣用語,當通讀原始碼時,真正重
要的不是這些習慣用語本身,而是這種型別的習慣用語的確存在,而且
是不斷地被使用和發展的。
3、減少#if和#ifdef的使用
現在的Linux核心已經移植到不同的平臺上,但是我們還必須解決
移植過程中所出現的問題。大部分支援各種不同平臺的程式碼由於必須包
含許多預處理程式碼而已經變得非常不規範。Linux關注的焦點很明顯是
實現程式碼在各種CPU上的可移植性,對於這類問題來說,前處理器是一
種錯誤的解決方式。這些雜亂的問題使得程式碼晦澀難懂。更為糟糕的是
,增加對新的平臺的支援有可能要求重新遍歷這些雜亂分佈的低質量代
碼段(實際上你很難找到這類程式碼段的全部)。
與現有方式不同的是,Linux一般透過簡單函式(或者是宏)呼叫
來抽象出不同平臺間的差異。核心的移植可以透過實現適合於相應平臺
的函式(或宏)來實現。這樣不僅使程式碼的主體簡單易懂,而且在移植
的過程中還可以比較容易地檢測出你沒有注意到的內容:如引用未申明
函式時會出現連結錯誤。有時用前處理器來支援不同的體系結構,但這
種方式並不常用,而相對於程式碼風格的變化就更是微不足道了。
原作者:flywings
Linux核心同時使用C語言和組合語言來實現。這兩種語言需要一
定的平衡:C語言編寫的程式碼移植性較好,易於維護,而組合語言編寫
的程式則速度較快。一般只有在速度是關鍵因素或者一些因平臺相關
特性而產生的特殊要求(例如直接和記憶體管理硬體進行通訊)時才採
用匯編語言。
實際上,即使核心並未採用C++的物件特性,部分核心也可以在g++
(GNU的C++編譯器)下進行編譯。同其他物件導向的程式語言相比較,
相對而言C++的開銷是較低的,但是對核心開發人員來說,這已經是太
多了。
1、gcc特性的使用
Linux核心被設計為必須使用GNU的C編譯器gcc來編譯,而不是任何
一種C編譯器都可以使用。核心程式碼有時要使用gcc特性。
一些gcc特有程式碼只是簡單地使用gcc語言擴充套件,例如允許在C(不
只是C++)中使用inline關鍵字指示行內函數。也就是說,程式碼中被調
用的函式在每次函式呼叫時都會被擴充,因而就可以節約實際函式呼叫
的開銷。
一般情況下,程式碼的編寫方式比較複雜。因為對於某些型別的輸入
,gcc能夠產生比其他輸入效率高的執行程式碼。從理論上講,編譯器可
以最佳化具有相同功能的兩種對等的方法,並且得到相同的結果。因此,
程式碼的編寫方式是無關緊要的。但是在實際中,用某種方法編寫所產生
的程式碼要比用另外一些方法編寫所產生的程式碼執行速度上快許多。核心
開發人員知道怎樣才能產生更高效的執行程式碼,這不斷地在他們編寫的
程式碼中反映出來。
例如,考慮核心中經常使用的goto語句--為了提高速度,核心中經
常大量使用這種一般要避免使用的語句。整個核心的比例大概是每260
行一個goto語句,比例如此高的原因是核心源程式的核心,在這裡速度
比其他因素都需要優先考慮。
2、核心程式碼習慣用語
核心程式碼中使用了一些顯著的習慣用語,當通讀原始碼時,真正重
要的不是這些習慣用語本身,而是這種型別的習慣用語的確存在,而且
是不斷地被使用和發展的。
3、減少#if和#ifdef的使用
現在的Linux核心已經移植到不同的平臺上,但是我們還必須解決
移植過程中所出現的問題。大部分支援各種不同平臺的程式碼由於必須包
含許多預處理程式碼而已經變得非常不規範。Linux關注的焦點很明顯是
實現程式碼在各種CPU上的可移植性,對於這類問題來說,前處理器是一
種錯誤的解決方式。這些雜亂的問題使得程式碼晦澀難懂。更為糟糕的是
,增加對新的平臺的支援有可能要求重新遍歷這些雜亂分佈的低質量代
碼段(實際上你很難找到這類程式碼段的全部)。
與現有方式不同的是,Linux一般透過簡單函式(或者是宏)呼叫
來抽象出不同平臺間的差異。核心的移植可以透過實現適合於相應平臺
的函式(或宏)來實現。這樣不僅使程式碼的主體簡單易懂,而且在移植
的過程中還可以比較容易地檢測出你沒有注意到的內容:如引用未申明
函式時會出現連結錯誤。有時用前處理器來支援不同的體系結構,但這
種方式並不常用,而相對於程式碼風格的變化就更是微不足道了。
原作者:flywings
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-963187/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux核心的組成部分(轉)Linux
- Ubuntu的特點(轉)Ubuntu
- 雲時代資料庫的核心特點資料庫
- 阿里開源superAGI程式碼分析【prompt部分】-核心還是react阿里React
- Linux核心程式設計(阻塞程式)(轉)Linux程式設計
- Linux核心模組的程式設計方法(轉)Linux程式設計
- Linux核心模組程式設計--阻塞程式(轉)Linux程式設計
- Linux 核心偵錯程式內幕(轉)Linux
- Linux核心模組程式設計指南(轉)Linux程式設計
- linux核心系列之程式管理(轉)Linux
- Linux核心程式設計(結論)(轉)Linux程式設計
- 通訊業的專案特點(轉)
- Linux核心模組程式設計指南(一)(轉)Linux程式設計
- O2O模式特點及營銷核心模式
- 編譯核心的一點點經驗(轉)編譯
- LINUX 核心的型別(轉)Linux型別
- Linux核心調優部分引數說明Linux
- 精通型程式設計師的特點程式設計師
- Linux核心模組程式設計--中斷處理程式(轉)Linux程式設計
- 盤點Linux作業系統的六大特點!Linux作業系統
- 揭秘Linux核心偵錯程式之內幕(轉)Linux
- Linux核心模組程式設計--替代printk系列(轉)Linux程式設計
- Linux核心模組程式設計--系統呼叫(轉)Linux程式設計
- 什麼是JavaScript及其特點(轉)JavaScript
- 低程式碼開發平臺的特點
- 乾淨程式碼的幾個特點 -Xebia
- Linux系統應用程式和核心模組的區別(轉)Linux
- LikeLib區塊鏈核心特點—無需許可的創新區塊鏈
- 資料庫防火牆的特點和核心功能是什麼?資料庫防火牆
- 什麼是Linux?Linux主要特點有哪些?Linux
- Linux有什麼特點呢?Linux學習Linux
- LINUX 核心程式管理Linux
- LINUX核心升級 (轉)Linux
- Linux核心分析方法(轉)Linux
- LINUX核心升級(轉)Linux
- 大資料開源框架特點大總結大資料框架
- Linux核心程式設計實戰經驗談(轉)Linux程式設計
- Linux核心模組程式設計--啟動引數(轉)Linux程式設計