Androidソース分析--loggerカーネル駆動から

2190 ワード

loggerのドライバはファイルloggerである.c、カーネルdriver/staging/androidディレクトリに位置する.
最後の行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”)。