Linux setup巨集解析

2021-08-10 13:36:11 字數 1722 閱讀 4779

__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...