__setup
這條巨集在linux kernel
中使用最多的地方就是定義處理kernel的啟動引數的函式及資料結構,巨集定義如下:
#define __setup(str, fn) \
__setup_param(str, fn, fn, 0)
#define __setup_param(str, unique_id, fn, early) \
static char __setup_str_##unique_id __initdata __aligned(1) = str; \
static struct obs_kernel_param __setup_##unique_id \
__used __section(.init.setup) \
__attribute__((aligned((sizeof(long))))) \=
使用kernel
中的例子分析一下這兩條定義:
__setup("root=",root_dev_setup);
這條語句出現在init/do_mounts.c
中,其作用是處理kernel啟動時的像root=/dev/mtdblock3之類的引數的。
分解一下這條語句,首先變為:
__setup_param("root=",root_dev_setup,root_dev_setup,0);
繼續分解,將得到下面這段代嗎:
static char __setup_str_root_dev_setup_id __initdata__aligned(1) = "root=";
static struct obs_kernel_param __setup_root_dev_setup_id
__used __section(.init.setup)
__attribute__((aligned((sizeof(long)))))
= ;
這段**定義了兩個變數:字元陣列變數__setup_str_root_dev_setup_id
,其初始化內容為"root=",由於該變數用 __initdata修飾,它將被放入.init.data輸入段;另一變數是結構變數__setup_root_dev_setup_id,其型別為 structobs_kernel_param, 該變理被放入輸入段.init.setup中。結構struct struct obs_kernel_param也在該檔案中定義如下:
struct obs_kernel_param ;
變數__setup_root_dev_setup_id
的三個成員分別被初始化為:
__setup_str_root_dev_setup_id
-->
前面定義的字元陣列變數,初始內容為"root="。
root_dev_setup
-->
通過巨集傳過來的處理函式。 0
-->
常量0,該成員的作用以後分析。
現在不難想像核心啟動時怎麼處理啟動引數的了:通過__setup
巨集定義obs_kernel_param結構變數都被放入.init.setup段中,這樣一來實際是使.init.setup段變成一張表,kernel在處理每乙個啟動引數時,都會來查詢這張表,與每乙個資料項中的成員str進行比較,如果完全相同,就會呼叫該資料項的函式指標成員setup_func所指向的函式(該函式是在使用__setup巨集定義該變數時傳入的函式引數),並將啟動引數如root=後面的內容傳給該處理函式。
DECLARE HANDLE巨集解析
在mfc原始碼中,經常看到這樣的語句 declare handle hdrvr declare handle hdtrcv 檢視declare handle定義如下 ifdef strict typedef void handle define declare handle name struct ...
linux常用巨集解析
前言 linux核心原始碼裡有很多巨集,為了能更好地理解核心和驅動原始碼,有必要對一些常用巨集做乙個梳理和解析,在此專門做一篇博文來幫助學習,並在以後的學習中逐步新增和完善。正文1.ior type,nr,size 用法 define gpio ioc magic g define ioctl gp...
核心current巨集解析
technorati 標籤 current thread info 在核心中,可以通過current巨集來獲得當前執行程序的task struct指標。現在來簡要分析以下 最原始的定義如下 define current get current define get current current t...