高效學習Linux核心——從原始碼中的宏下手
在閱讀Linux核心程式碼時,在程式碼的開頭總是有各種各樣的宏定義,瞭解熟悉這些宏定義,對於程式碼的理解和快速修改程式碼提供了便利。 有些宏相對簡單,一眼便可以瞭解作用,有些就稍微複雜一些,需要一些邏輯。 今天就給大家總結了一些常見的宏定義,幫助大家更快,更好的理解核心程式碼。
什麼是宏
在 C 語言中,可以採用命令 #define 來定義宏。該命令允許把一個名稱指定成任何所需的文字,例如一個常量值或者一條語句。在定義了宏之後,無論宏名稱出現在原始碼的何處,前處理器都會把它用定義時指定的文字替換掉。
替換列表和識別符號列表都是將字串 token 化以後的列表。區別在於識別符號列表使用,作為不同引數之間的分割符。每一個引數都是一個 token 化的列表。在宏中空白符只起到分割 token 的作用,空白符的多少對於前處理器是沒有意義的。
核心中常見的宏
BUILD_BUG_ON宏
BUILD_BU
G_ON_ZERO(e) 宏
檢查表示式e是否為0,為0編譯透過且返回0;如果不為0,則編譯不透過。
如果e為0,則該結構體擁有一個int型的資料域,並且規定它所佔的位的個數為0。
用於檢查x是否為type型別,如果不是會丟擲(warning: comparison of distinct pointer types lacks a cast)例如,在核心中/include/linux/rwlock.h中便使用到了該宏,用於讀寫鎖的定義中。
__is_constexpr宏
判斷 x 是否為整數常量表示式:如果 x 是常量表示式,則 (void )((long)(x) 0l) 是一個空指標常量,就會使用第三個運算元即 ((int *)8) 的型別。如果不是常量表示式,則會使用第二個運算元 void 型別。
利用 typeof 獲取要交換變數的型別。
container_of宏
根據一個結構體變數中的成員變數來獲取整個結構體變數的指標。
ALIGN對齊宏
對齊是採用上對齊的方式,例如 0x123 以 16 對齊,結果是 0x130 ,因為對齊常在分配記憶體時使用,所以分配的要比需要的大。
mdelay宏
忙等待函式,在延遲過程中無法執行其他任務,會佔用 CPU 時間,延遲時間是準確的。
總結
像開頭說的,核心原始碼中有各種各樣的宏,在這裡不能一一羅列。宏的使用使得程式碼開發更加標準化,瞭解更多的宏,無疑可以更好的更深入的理解程式碼含義,如對此有興趣,可在網上搜尋更多的核心宏,瞭解更多關於Linux核心的知識。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989353/viewspace-2741935/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 高效學習Linux核心——核心模組編譯Linux編譯
- 「從原始碼中學習」Vue原始碼中的JS騷操作原始碼VueJS
- 《Linux核心完全註釋》學習筆記:2.7 Linux核心原始碼的目錄結構Linux筆記原始碼
- 從bootstrap原始碼中學習Sass(一)boot原始碼
- 學習大資料從哪兒下手大資料
- Linux核心原始碼目錄Linux原始碼
- Riffa學習——Linux Driver原始碼分析Linux原始碼
- 【分享】從Mybatis原始碼中,學習到的10種設計模式MyBatis原始碼設計模式
- Linux無系統核心原始碼Linux原始碼
- 「從原始碼中學習」徹底理解Vue選項Props原始碼Vue
- Linux核心學習總覽Linux
- Linux核心模組學習Linux
- 從YYImage原始碼中學習如何處理圖片顯示原始碼
- 從 Linux 原始碼看 socket 的 closeLinux原始碼
- linux核心原始碼 -- list連結串列Linux原始碼
- mybatis原始碼學習:從SqlSessionFactory到代理物件的生成MyBatis原始碼SQLSession物件
- 從linux原始碼看epollLinux原始碼
- 從 Vue3 原始碼學習 Proxy & ReflectVue原始碼
- Laravel核心程式碼學習--HTTP核心LaravelHTTP
- Linux從頭學08:Linux 是如何保護核心程式碼的?【從真實模式到保護模式】Linux模式
- 微軟提出程式圖方法:從原始碼中學習,揪出惱人的Bug微軟原始碼
- 深入學習 Linux 核心模組Linux
- Linux核心學習—— 1核心體系結構Linux
- Linux運維新手如何高效的提問?學習linuxLinux運維
- 從linux原始碼看socket(tcp)的timeoutLinux原始碼TCP
- 從Linux原始碼看Socket(TCP)的bindLinux原始碼TCP
- 從Linux原始碼看Socket(TCP)的acceptLinux原始碼TCP
- android原始碼學習-Handler機制及其六個核心點Android原始碼
- 「從原始碼中學習」面試官都不知道的Vue題目答案原始碼面試Vue
- 如何學習 PHP 原始碼 – 從編譯開始PHP原始碼編譯
- Vue原始碼學習(二)——從巨集觀看VueVue原始碼
- 從原始碼學習設計模式之模板方法原始碼設計模式
- 從lodash原始碼學習節流與防抖原始碼
- 原始碼學習原始碼
- 關於vim看linux 核心原始碼時的程式碼補全Linux原始碼
- underscorejs原始碼學習系列(未完,更新中)JS原始碼
- 從原始碼的角度再學「Thread」原始碼thread
- [轉帖]Linux核心原始碼分析分享專題Linux原始碼