歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核中常見的符號

[THIS_MODULE]

模塊是一種可以在內核運行過程中動態加載、卸載的內核功能組件。2.6內核中模塊在被使用時,是不允許被卸載的。編程是需要用”使用計數”來描述模塊是否在被使用。THIS_MODULE就充當了這個功能。

[likely& unlikely]

在2.6的內核中經常看到這兩個符號,表面上看if(likely(value))和if(unlikely(value))其實都等同於if(value),但是在實際上執行是不同,加likely的意識著value為真的可能性要大;unlikely與之相反;加上這兩個宏編譯器會對其進行優化,提高程序效率。

[BUG_ON]

#define BUG_ON(condition) do { \

if(unlikely(condition)) BUG(); \

} while(0)

一些內核調用可以用來方便標記bug,提供斷言並輸出信息。最常用的兩個是BUG()和BUG_ON()。當被調用的時候,它們會引發oops,導致棧的回溯和錯誤信息的打印。為什麼這些聲明會導致 oops跟硬件的體系結構是相關的。大部分體系結構把BUG()和BUG_ON()定義成某種非法操作,這樣自然會產生需要的oops。

[IS_ERR& PTR_ERR & ERR_PTR]

#define IS_ERR_VALUE(x) unlikely((x) >=(unsigned long)-MAX_ERRNO)

IS_ERR宏用來檢測x地址是否有效;

static inline void *ERR_PTR(long error)

{

         return(void *) error;

}

 

static inline long PTR_ERR(const void *ptr)

{

         return(long) ptr;

}

[container_of]

/**

 *container_of - cast a member of a structure out to the containing structure

 *@ptr:    the pointer to the member.

 *@type:   the type of the container structthis is embedded in.

 *@member: the name of the member within the struct.

 *

 */

#define container_of(ptr, type, member)({          \

         consttypeof(((type *)0)->member)*__mptr = (ptr);    \

                        (type *)((char *)__mptr - offsetof(type,member)); })

這可能是內核裡面最長見的宏,替開發者解決了不少問題。通過指向成員(成員可以是一個結構體)member的指針ptr,來獲取包含該成員的結構體type的指針。

EXAMPLE:

struct example_1 {
    struct example_2 s;
    int a;
    int b;
};

struct example_2 *doo;

struct example_1 *poo = container_of(doo, struct example_1, s);

[__init& __initdata & __exit & __exitdata]

這些宏定義的作用是告訴編譯器將這些函數或者數據放入相應的section中,而在模塊加載的階段,.ko文件中的代碼和數據的加載區域是根據section來加載的

比如:如果函數的定義中帶有__init,那麼這個函數的所有代碼被放入.init.text的section中;

如果函數的定義中帶有__initdata,那麼這個函數的所有代碼被放入.init.data的section中

之所以要使用這個宏定義,其中一個原因是標記為初始化的函數和數據,表明該函數和數據僅在初始化期間使用,在模塊裝載之後,模塊就會將初始化函數扔掉。這樣可以將該函數占用的內存釋放出來。

[ARRAY_SIZE]

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

用於計算數組x成員個數

Copyright © Linux教程網 All Rights Reserved