linux核心的 setup巨集的學習

2021-09-24 01:37:55 字數 1403 閱讀 3897

第一次看到這個巨集的時候是在

__setup("root=", root_dev_setup);

這個巨集是在核心掛載根檔案系統的時候呼叫的

先看__setup的定義:

#define __setup(str, fn)                   __setup_param(str, fn, fn, 0)

然後是__setup_param的定義:

#define __setup_param(str, unique_id, fn, early)            \

static char __setup_str_##unique_id __initdata = str;    \

static struct obs_kernel_param __setup_##unique_id    \

__attribute_used__                \

__attribute__((__section__(".init.setup")))    \

__attribute__((aligned((sizeof(long)))))    \

= 我們把__setup("root=", root_dev_setup);展開來看:

__setup_param("root=", root_dev_setup, root_dev_setup, 0)

static char __setup_str_root_dev_setup __initdata = "root="; 

static struct obs_kernel_param __setup_root_dev_setup    \

__attribute_used__                \

__attribute__((__section__(".init.setup")))    \

__attribute__((aligned((sizeof(long)))))    \

= 從結果看來這個巨集到最後定義了兩個東西,乙個是char型的字元陣列,裡面的值是 "root".另外乙個是定義了乙個結構體物件,

這個結構體的型別是:

struct obs_kernel_param ;

所以第二個是在填充這個結構體,並且把他放在.init.setup段中

__setup的第二個引數是乙個函式指標,返回值是int,引數是char *,用來填充上面結構體中的setup_func這個成員變數

聯想給資料分段的作用就是為了把同類的資料放在一起便於核心使用和查詢

①在do_early_param中被呼叫,但是這裡的被呼叫必須要求early引數是1,所以__setup("root=", root_dev_setup);並不是在這個函式中

②在obsolete_checksetup中被呼叫,如果early被設定成0就會呼叫上面設定的函式

Linux核心中 setup的用途

在linux核心 中經常會看到 setup,如下所示 setup nfsroot nfs root setup 這是乙個巨集,它的定義在include linux init.h define setup str,fn setup param str,fn,fn,0 我們這裡暫不管 setup par...

linux3 核心的 setup函式

在核心 中經常會看到 setup函式,這個函式從哪來,到哪去?下面我們逐一分析 例如在i2c驅動中就有這麼乙個setup函式 setup i2c bus omap i2c bus setup 我們先要直到它是從哪來的 看如下 define setup param str,unique id,fn,e...

linux 核心模組中的巨集

author dansen xzd2734 163.com 編寫模組時一般都需要包含標頭檔案,而在module.h中定義了符號 module kernel version static const char module kernel version attribute section modinf...