Androidソース分析--loggerカーネル駆動から
2190 ワード
loggerのドライバはファイルloggerである.c、カーネルdriver/staging/androidディレクトリに位置する.
最後の行
device_initcallはカーネルinclude/linux/initです.hで定義されたマクロは、xxxのような複数のマクロに近い.initcallの定義によるとhで定義し、module以外に構成されたドライバでxxx_initcallは最終的に#define_initcall(level,fn,id)では、levelがカーネル起動中に呼び出す優先度を決定します.以下のようにします.
moduleとして構成されたドライバでxxx_initcallは
注意moduleモジュール以外の構成の場合、init.hでは同様に
最後の行
device_initcall
(logger_init
)の入口から、カーネルは起動時にlogger_init
関数を呼び出す.device_initcallはカーネルinclude/linux/initです.hで定義されたマクロは、xxxのような複数のマクロに近い.initcallの定義によるとhで定義し、module以外に構成されたドライバでxxx_initcallは最終的に#define_initcall(level,fn,id)では、levelがカーネル起動中に呼び出す優先度を決定します.以下のようにします.
#define device_initcall(fn) define_initcall(“6”,fn,6)
moduleとして構成されたドライバでxxx_initcallは
module_init
と定義.
#define device_initcall(fn) module_init(fn)
注意moduleモジュール以外の構成の場合、init.hでは同様に
module_init
マクロが定義されているが、以下の定義がある.
#define
initcall(fn) device_initcall(fn)
define module_init(x) __initcall(x)
Kconfig , logger , binder ashm .
define_initcall , linux linux . :
define_initcall(level,fn, id) , , section 。 ,do_initcalls() section , 。
#define define_initcall(level,fn,id) \
static initcall_t initcall##fn##id used \
attribute((section(“.initcall” level “.init”))) = fn initcall_t :
typedef int (*initcall_t)(void);
attribute((section())) section 。 :
1) initcall##fn##id ( ## ,);
2) fn;
3) “.initcall” level “.init" section ( level=“1”, section “.initcall1.init”)。