Mendel Linux编译自定义驱动刷入后模块不存在 操作步骤排查
问题描述
我是Mendel Linux开发新手,已按照官方入门指引克隆代码,在/linux-imx/drivers/mytestdriver路径下添加自定义内核模块,完成如下修改:
- 新增
mytestdriver.c驱动源码文件 - 新增目录下的编译配置文件,内容为:
obj-$(CONFIG_TEST_MYDRIVER) += mytestdriver.o
- 新增目录下的内核配置Kconfig文件,内容为:
menu "Test Driver" config TEST_MYDRIVER tristate "Test Driver" default m
- 修改
/linux-imx/arch/arm64/configs/defconfig文件,新增配置项:
CONFIG_TEST_MYDRIVER=m
完成修改后执行m docker-linux-imx和FETCH_PACKAGES=true m命令重新构建代码,编译日志显示模块编译、链接、安装流程正常执行:
CC [M] drivers/mytestdriver/mytestdriver.o CC drivers/mytestdriver/mytestdriver.mod.o LD [M] drivers/mytestdriver/mytestdriver.ko INSTALL drivers/mytestdriver/mytestdriver.ko
通过fastboot将构建产物刷入设备后,执行lsmod命令未列出mytestdriver模块,检查/lib/modules/4.14.98-imx/kernel、/lib/modules/4.14.98-imx/extras目录,均未找到mytestdriver.ko文件,确认现有操作流程存在遗漏。
解决方案
你遗漏了3处关键配置和构建步骤,这也是Mendel封闭构建系统和手动编译原生内核的典型差异:
- 未在驱动层Makefile中注册新增的驱动目录
仅在自定义驱动目录下创建Kconfig和Makefile不会被内核构建系统识别,需要编辑/linux-imx/drivers/Makefile,在文件中追加一行:
没有这行配置的话,构建系统不会遍历你新建的obj-$(CONFIG_TEST_MYDRIVER) += mytestdriver/mytestdriver目录,你看到的编译日志是增量编译阶段生成的临时产物,不会进入后续的镜像打包流程。 - 文件名大小写不符合构建系统规则
内核构建系统默认识别的子目录编译配置文件名为Makefile(仅首字母大写),如果你创建的文件名为MakeFile(F大写),构建系统会直接忽略该文件,导致模块无法被正常安装到输出目录。 - 未将模块打包进最终刷写的镜像分区
Mendel系统的动态内核模块存放在rootfs分区的/lib/modules/<内核版本>/路径下,仅编译内核、刷写boot分区不会更新rootfs里的模块文件:- 内核编译完成后,需要在构建目录执行
make modules_install INSTALL_MOD_PATH=<构建输出目录对应的rootfs/lib/modules路径>,确认mytestdriver.ko被拷贝到输出目录的对应模块路径下 - 重新完整生成rootfs镜像后再通过fastboot刷入,不要只刷boot分区
- 设备首次启动后执行
depmod -a更新模块依赖索引,再通过modprobe mytestdriver加载模块,此时执行lsmod即可看到对应模块,对应ko文件也会出现在/lib/modules/4.14.98-imx/kernel/drivers/mytestdriver/路径下。
- 内核编译完成后,需要在构建目录执行
内容的提问来源于stack exchange,提问作者Aromal PJ
相关产品推荐
相关产品推荐

