内核模块的依赖是装载时的大问题。大部分时候可以通过 Modules.deps 或者 Modules.order 进行依赖模块的自动加载。但是有时候可能没有这些依赖配置(例如树外编译),以及其加载过程不透明(不知道到底是哪个符号依赖于哪个模块)。

modtree

对树外编译模块依赖写了一个简单的脚本,仓库地址:
https://github.com/Eknight-Eutopia/mod_tree
效果如下:

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
msm-kgsl
├── socinfo
│ └── smem
├── llcc-qcom
│ └── socinfo
│ └── smem
├── qcom-dcvs
│ └── dcvs-fp
│ ├── qcom-rpmh
│ │ ├── qcom-ipc-logging
│ │ │ └── minidump
│ │ │ ├── debug-symbol
│ │ │ └── smem
│ │ └── cmd-db
│ └── cmd-db
├── governor-msm-adreno-tz
│ └── qcom-scm
├── qcom-scm
├── cmd-db
├── msm-performance
│ ├── qcom-pmu-lib
│ │ ├── qcom-scmi-client
│ │ └── qcom-llcc-pmu
│ └── sched-walt
│ └── socinfo
│ └── smem
├── qcom-aoss
│ └── qcom-ipc-logging
│ └── minidump
│ ├── debug-symbol
│ └── smem
├── mem-buf-dev
│ └── secure-buffer
│ └── qcom-scm
├── qcom-iommu-util
│ └── qcom-scm
├── clk-qcom
│ ├── gdsc-regulator
│ │ ├── proxy-consumer
│ │ └── debug-regulator
│ └── icc-clk
├── secure-buffer
│ └── qcom-scm
├── mdt-loader
│ └── qcom-scm
├── minidump
│ ├── debug-symbol
│ └── smem
├── qcom-va-minidump
│ └── minidump
│ ├── debug-symbol
│ └── smem
└── coresight

modgraph

基于neo4j来构造一个简单的模块依赖图,其中以目标模块为根节点,其存在自己的符号以及外部依赖的符号。外部符号有一部分是内核导出,另一部分则是由依赖的模块导出。
基于目标模块获取其依赖树,将每一个模块都作为一个节点,获取其导出符号以及未定义符号,符号也定义为节点。构造以下关系:

  • 模块依赖于其他模块则会指向其他模块,关系为Depends_on;
  • 模块指向自身模块导出符号,关系为Exports;
  • 模块指向未定义符号,关系为Uses;
  • 模块指向其他模块的导出符号,关系为Resolved_to;
    从而构建一个 内核模块的具体符号依赖图,实现仓库为:modgraph
    实现效果图为: