1005 views
# Notes on building LKM ###### tags: `blog` ### SAMSUNG 1. 确保目标手机可加载 LKM。通过 `cat /proc/kallsyms | grep load_module` 命令,如果 kernel 导出了 `load_module` 则表示可加载 LKM。(不排除厂商改过kernel,把`load_module`改成其他) 2. http://opensource.samsung.com/reception.do 下载对应的机型的 kernel 源码。需要确保下载的 kernel 源码和目标手机上的 kernel 版本一致,否则无法 `insmod`。 3. 根据下载的源码里的 `README_Kernel.txt` 编译 kernel。需要指定 `ARCH` 和 `CROSS_COMPILE`。另外为了编译 LKM,需要打开 `arch/{your_arch}/configs/{default_config}` 里的 `CONFIG_MODULES/CONFIG_MODULE_UNLOAD/CONFIG_MODULE_FORCE_UNLOAD` 3个配置。其中 `{default_config}` 是 `make` 时指定的配置文件。一个典型的 build kernel 脚本如下: ``` bash export ARCH=arm export CROSS_COMPILE=android-toolchains/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi- make msm8916_sec_defconfig make -j8 ``` 4. 编写 LKM 代码并编译。关于 LKM 编写及编译,网上找到的较好的一篇介绍:http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html。另外,kernel 源码树下也有文档,路径是 `Documentation/kbuild/modules.txt`。hello world 的 c 文件编写这里不介绍,说编译。一个典型的 hello world 的 Makefile 是这样的: ``` bash # 当指定 obj-m += {abc}.o 时,make 会查找 {abc}.c 去编译 .ko 文件 obj-m += hello.o export ARCH=arm export CROSS_COMPILE=android-toolchains/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi- # 这里是上述编译的 kernel 源码的路径。如果在编译 kernel 指定了输出路径(make 的 O选项), # 则 KDIR 应该是这个输出路径 export KDIR=../SM-G3608/Kernel default: $(MAKE) -C $(KDIR) M=$(PWD) clean: $(MAKE) -C $(KDIR) M=$(PWD) clean ``` 5. 其他机型的不同之处,待补充。