kernel与modules解耦

一、耦合:

        linux的kernel与modules存在耦合版本匹配,在版本不匹配(内核重新编译后,或者驱动模块编译依赖的内核版本跟运行版本不匹配)时候,会存在insmod 驱动模块失败的情形;

二、解耦:

        1、修改内核配置,去掉CONFIG_MODVERSIONS的选项,表示不增加sub-string;

        2、修改内核源码:./scripts/setlocalversion脚本,为res="$res${scm:+}";

        3、insmod如果是基于busybox的,需要做如下修改,force insmod:

                modutils/modutils.c中 finit_module(fd, options, 2);改为finit_module(fd, options, 0);

<think>好的,我现在需要帮助用户理解这个Android.mk文件,特别是针对ts_charger模块的。首先,我应该仔细阅读用户提供的Makefile内容,并逐步分析每个部分的作用。 用户可能对Android构建系统不太熟悉,所以需要从基础开始解释。首先,这个Makefile是用来编译内核模块的,特别是gt9xx_core.ko。用户可能想知道每一行的作用,以及整个文件的结构。 首先看到LOCAL_PATH的定义,这里通过$(call my-dir)获取当前目录路径,这是标准的Android.mk开头。接下来是关于DLKM_DIR的条件判断,根据平台SDK版本选择不同的路径。这里需要解释DLKM_DIR的作用,即动态可加载内核模块的目录,以及不同版本的区别。 然后,KBUILD_OPTIONS添加了CONFIG_TOUCHSCREEN_GT9XX=m,这说明模块会被编译为可加载模块。用户可能想知道这个配置选项的意义,以及如何影响编译过程。 接下来是include $(CLEAR_VARS),这是为了清除之前的变量,避免冲突。然后定义模块名称、构建名称、类别、标签等。需要解释LOCAL_MODULE_CLASS为DLKM表示这是一个动态内核模块,TAGS设为optional表示可能不会默认编译。 LOCAL_MODULE_DEBUG_ENABLE设置为true,可能启用调试信息。模块的所有者和vendor模块的设置也需要解释,特别是vendor模块的作用。 LOCAL_SRC_FILES使用wildcard获取所有源文件,这可能包括多个子目录。模块的输出路径是KERNEL_MODULES_OUT,用户可能想知道这个变量的具体位置。 BOARD_VENDOR_KERNEL_MODULES将生成的模块添加到构建系统中,确保它被包含在镜像里。接下来的条件判断检查是否存在kernel_platform目录,选择不同的构建脚本,这里需要解释Build_external_kernelmodule.mk和AndroidKernelModule.mk的区别。 最后,用户可能想知道这个Makefile的整体流程,以及如何在实际项目中使用。可能需要提醒用户注意路径的正确性,尤其是DLKM_DIR在不同SDK版本下的变化,以及wildcard的使用是否覆盖了所有必要的源文件。 还要检查是否有常见的错误点,比如条件判断是否正确,模块名称是否匹配,路径是否存在等。用户可能在实际使用中遇到问题,比如模块未正确编译或包含,需要根据这些点进行排查。 总结来说,应该分步骤解释每个关键部分的作用,结合Android构建系统的知识,帮助用户理解这个Makefile的结构和功能,以及可能需要注意的地方。</think>以下是对该Android.mk文件的逐步分析,主要针对`ts_charger`模块(实际是`gt9xx_core.ko`触摸屏驱动模块)的构建逻辑: --- ### 一、基础路径定义 ```makefile LOCAL_PATH := $(call my-dir) ``` - **作用**:通过`$(call my-dir)`获取当前文件所在目录路径,作为模块的本地路径。 --- ### 二、动态内核模块目录选择 ```makefile ifeq ($(call is-platform-sdk-version-at-least,16),true) DLKM_DIR := $(TOP)/device/qcom/common/dlkm else DLKM_DIR := build/dlkm endif ``` - **条件判断**:根据Android平台SDK版本是否≥16(对应Android 4.1 Jelly Bean)选择`DLKM_DIR`路径 - **含义**:不同Android版本中动态可加载内核模块(DLKM)的构建目录位置不同 --- ### 三、内核构建选项 ```makefile KBUILD_OPTIONS += CONFIG_TOUCHSCREEN_GT9XX=m ``` - **关键配置**:声明将`CONFIG_TOUCHSCREEN_GT9XX`编译为内核模块(`=m`),而非内置(`=y`) --- ### 四、模块属性定义 ```makefile include $(CLEAR_VARS) LOCAL_MODULE := gt9xx_core.ko # 最终生成的模块名称 LOCAL_MODULE_KBUILD_NAME := gt9xx_core.ko # 内核构建系统中的名称 LOCAL_MODULE_CLASS := DLKM # 归类为动态内核模块 LOCAL_MODULE_TAGS := optional # 非强制编译模块 LOCAL_MODULE_DEBUG_ENABLE := true # 启用调试符号 LOCAL_MODULE_OWNER := thundercomm # 模块所有者 LOCAL_VENDOR_MODULE := true # 标记为vendor分区模块 LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/**/*) $(wildcard $(LOCAL_PATH)/*) # 包含所有子目录文件 ``` --- ### 五、输出路径模块注册 ```makefile LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/gt9xx_core.ko ``` - **输出路径**:`KERNEL_MODULES_OUT`是内核模块的标准输出目录(通常为`out/target/product/<device>/obj/kernel/...`) - **模块注册**:通过`BOARD_VENDOR_KERNEL_MODULES`将模块添加到系统构建清单 --- ### 六、构建脚本选择 ```makefile ifneq (,$(wildcard $(TOP)/kernel_platform)) include $(DLKM_DIR)/Build_external_kernelmodule.mk else include $(DLKM_DIR)/AndroidKernelModule.mk endif ``` - **条件判断**:检查是否存在`kernel_platform`目录 - **选择构建方式**: - 如果存在:使用外部内核模块构建脚本(常见于独立内核源码树) - 否则:使用默认的内核模块构建脚本 --- ### 七、注意事项 1. **路径兼容性**:`DLKM_DIR`的路径选择需Android版本匹配,尤其是跨平台移植时 2. **通配符风险**:`LOCAL_SRC_FILES`使用`wildcard`可能包含非源码文件(需确保目录清洁) 3. **内核配置依赖**:需确保内核配置中启用了`CONFIG_MODULES`和依赖项 4. **调试符号**:`LOCAL_MODULE_DEBUG_ENABLE`在正式发布版本中应设为`false` --- ### 八、典型问题排查 - **模块未生成**:检查`KERNEL_MODULES_OUT`路径是否存在写权限 - **版本兼容性**:确认`Build_external_kernelmodule.mk`当前NDK/Build版本兼容 - **符号未导出**:若依赖其他内核符号,需在驱动代码中使用`EXPORT_SYMBOL` 该Makefile展示了Android平台下通过DLKM机制编译第三方内核模块的标准方法,适用于需要内核版本解耦的硬件驱动开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值