一、汇编相关部分的代码流程分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
二、C相关的函数流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
三、友情提供相关信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
四、接下来执行那些initcall函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
|
五、initcall的执行顺序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
注意Init.h (kernel-3.10\include\linux) 中的宏的定义:
在编译进内核时,MODULE 是没有定义的,所以 #ifndef MODULE 是真的;
当编译成.ko模块时,MODULE 是已经定义的, #ifndef MODULE 为假;
也就是根据编译到的目的地方不同,所定义的宏也不一致:
例如:
#ifndef MODULE
#define arch_initcall(fn) __define_initcall(fn, 3)
#else
#define arch_initcall(fn) module_init(fn)
#endif
在MODULE被定义的情况下(大部分可动态加载的driver模块都属于此, obj-m),module_init定义如下:
#define module_init(initfn) \
static inline initcall_t __inittest(void) \
{ return initfn; } \
int init_module(void) __attribute__((alias(#initfn)));
这段宏定义关键点是后面一句,通过alias将initfn变名为init_module。
前面那个__inittest的定义其实是种技巧,用来对initfn进行某种静态的类型检查,
如果阁下将模块初始化函数定义成,比如,void gpio_init(void)或者是int gpio_init(int),
那么在编译时都会有类似下面的warning:
GPIO/fsl-gpio.c: In function '__inittest':
GPIO/fsl-gpio.c:46: warning: return from incompatible pointer type
通过module_init将模块初始化函数统一别名为init_module,这样以后insmod时候,
在系统内部会调用sys_init_module()去找到init_module函数的入口地址。
如果objdump -t gpio.ko,就会发现init_module和gpio_init位于相同的地址偏移处。
简言之,这种情况下模块的初始化函数在insmod时候被调用
六、编译和反编译设备树
单独编译设备树:
cd linux-x.xx & make dtbs
生成的dtb在目录linux-x.xx/arch/xxx/boot/dts下;
Android系统对应的目录为:out\target\product\rq6735_35gt_b_l1\obj\KERNEL_OBJ\arch\arm\boot\dts下;
生成的目标文件的后缀为.dtb。
利用dtc工具,反编译dtb,生成dts:
Linux源码生成的工具路径:linux-x.xx/scripts/dtc/dtc
Android源码生成的工具路径:out\target\product\rq6735_35gt_b_l1\obj\KERNEL_OBJ\scripts\dtc\dtc
./dtc -I dtb -O dts xxxx.dtb -o xxxx.dts