高效學習Linux內核——從源碼中的宏下手

原創 作者 徐工 2020-03-19 15:10:00 Linux內核代碼 宏定義

在閱讀Linux內核代碼時,在代碼的開頭總是有各種各樣的宏定義,了解熟悉這些宏定義,對于代碼的理解和快速修改代碼提供了便利。有些宏相對簡單,一眼便可以了解作用,有些就稍微復雜一些,需要一些邏輯,今天就給大家總結了一些常見的宏定義,幫助大家更快,更好的理解內核代碼。

一、什么是宏

在C語言中,可以采用命令#define來定義宏。該命令允許把一個名稱指定成任何所需的文本,例如一個常量值或者一條語句。在定義了宏之后,無論宏名稱出現在源代碼的何處,預處理器都會把它用定義時指定的文本替換掉。

 

替換列表和標識符列表都是將字符串token化以后的列表。區別在于標識符列表使用,作為不同參數之間的分割符。每一個參數都是一個token化的列表。在宏中空白符只起到分割token的作用,空白符的多少對于預處理器是沒有意義的。

二、內核中常見的宏

__CONCAT宏

"##"用于粘貼兩個參數,"#"用于替換參數:

 


BUILD_BUG_ON宏

 

!!(e)對e的結果進行兩次求非。如果e為0,則結果為0;如果e不為0,則結果為1。所以上述表達式的結果有兩種:

1,condition為真時,sizeof(char[-1]),產生錯誤,編譯不通過

2,condition為假時,sizeof(char[1]),編譯通過

例如,在飛凌6Q的3.0.35的內核中,/driver/usb/storage/uas.c/usb接口u盤的驅動中就有使用該宏

 


BUILD_BUG_ON_ZERO(e)宏

 

檢查表達式e是否為0,為0編譯通過且返回0;如果不為0,則編譯不通過

 

如果e為0,則該結構體擁有一個int型的數據域,并且規定它所占的位的個數為0。

 

如果e非0,結構體的int型數據域的位域將變為一個負數,產生語法的錯誤


typecheck宏

該宏在/include/linux/typecheck.h中定義

 

用于檢查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類型。


roundup宏

該宏在/include/linux/kernel.h中被定義。

 

返回一個能夠整除y并且大于x,最接近x的值,向上取整,可用于地址的內存對齊。


clamp宏

 

判斷val是否在lo和hi的范圍內,如果小于lo,返回lo,如果大于hi則返回hi,如果在lo和hi之間就返回val。


swap宏

 

利用typeof獲取要交換變量的類型


container_of宏

 

根據一個結構體變量中的成員變量來獲取整個結構體變量的指針


ALIGN對齊宏

 

對齊是采用上對齊的方式,例如0x123以16對齊,結果是0x130,因為對齊常在分配內存時使用,所以分配的要比需要的大。


mdelay宏

 

忙等待函數,在延遲過程中無法運行其他任務,會占用CPU時間,延遲時間是準確的


三、總結

像開頭說的,內核源碼中有各種各樣的宏,在這里不能一一羅列。宏的使用使得代碼開發更加標準化,了解更多的宏,無疑可以更好的更深入的理解代碼含義,如對此有興趣,可在網上搜索更多的內核宏,了解更多關于Linux內核的知識


相關產品 >

  • OKT507-C 開發板

    CPU: T507 工業級處理器,超低功耗,10年+生命周期|推薦全志工業級T507開發板系列,飛凌OKT507-C開發板采用全志T507 四核工業級處理器 T507設計開發,Cortex-A53架構,工業級寬溫,性能強,低功耗,是一款高性價比的工業級產品,提供豐富的開發設計資料,提供產品規格書,軟硬件手冊等,全志的T507適用于車載電子、電力、醫療、工業控制、物聯網、智能終端等領域。

    了解詳情
    OKT507-C 開發板
  • FETT507-C核心板

    推薦T507,全志T507核心板采用工業級處理器設計開發,提供T507規格書,T507各類設計資料。FETT507-C核心板集成全志T507四核工業級處理器設計開發,Cortex-A53架構,主頻1.5GHz,集成G31 GPU,內存2GB DDR3L,存儲8GB eMMC。整板工業級運行溫寬,支持絕大部分當前流行的視頻及圖片格式解碼,具有穩定可靠的工業級產品性能、低功耗以及豐富的用戶接口等優勢,搭載Linux、Android、Ubuntu*操作系統,適用于車載電子、電力、醫療、工業控制、物聯網、智能終端等領域 了解詳情
    FETT507-C核心板

推薦閱讀 換一批 換一批