Yocto:将内核模块配方添加到图像,但它不会在启动时加载
Yocto: Adding kernel module recipe to image, but it doesn't load on boot
出于测试目的,我使用 yocto 提供的示例配方来演示如何构建内核模块。
SUMMARY = "Example of how to build an external Linux kernel module"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"
inherit module
PR = "r0"
PV = "0.1"
SRC_URI = "file://Makefile \
file://hello.c \
file://COPYING \
"
S = "${WORKDIR}"
# The inherit of module.bbclass will automatically name module packages with
# "kernel-module-" prefix as required by the oe-core build environment.
hello.c
文件非常简单。
#include <linux/module.h>
int init_module(void)
{
printk("Hello World!\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye Cruel World!\n");
}
MODULE_LICENSE("GPL");
现在,我将此模块添加到我的图像配方中。
SUMMARY = "A console-only image that fully supports the target device \
hardware."
IMAGE_FEATURES += "splash package-management"
IMAGE_INSTALL += "test-mod autoconf automake binutils make busybox"
LICENSE = "MIT"
inherit core-image
当我启动映像时,我在/lib/modules目录中看到测试"hello.ko",但是当我检查dmesg
时,我没有看到指示内核模块的输出已加载。
当我在 hello.ko
上手动 运行 insmod
时,我得到了输出。另外,当我 运行 rmmod
时,我得到了输出。
我做错了什么?我需要这个模块在启动时自动加载。
编辑:
这是输出,验证模块未在启动时加载,但它是一个有效模块。
/ # dmesg | grep "Hello"
/ # insmod hello.ko
[ 68.503689] Hello World!
/ # rmmod hello.ko
[ 72.702035] Goodbye Cruel World!
您应该将您的模块名称添加到您的食谱中的 KERNEL_MODULE_AUTOLOAD,通常是这样的:
KERNEL_MODULE_AUTOLOAD += "hello"
这应该将您的模块名称放入图像上的 /etc/modules-load.d/modname.conf 中。
出于测试目的,我使用 yocto 提供的示例配方来演示如何构建内核模块。
SUMMARY = "Example of how to build an external Linux kernel module"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"
inherit module
PR = "r0"
PV = "0.1"
SRC_URI = "file://Makefile \
file://hello.c \
file://COPYING \
"
S = "${WORKDIR}"
# The inherit of module.bbclass will automatically name module packages with
# "kernel-module-" prefix as required by the oe-core build environment.
hello.c
文件非常简单。
#include <linux/module.h>
int init_module(void)
{
printk("Hello World!\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye Cruel World!\n");
}
MODULE_LICENSE("GPL");
现在,我将此模块添加到我的图像配方中。
SUMMARY = "A console-only image that fully supports the target device \
hardware."
IMAGE_FEATURES += "splash package-management"
IMAGE_INSTALL += "test-mod autoconf automake binutils make busybox"
LICENSE = "MIT"
inherit core-image
当我启动映像时,我在/lib/modules目录中看到测试"hello.ko",但是当我检查dmesg
时,我没有看到指示内核模块的输出已加载。
当我在 hello.ko
上手动 运行 insmod
时,我得到了输出。另外,当我 运行 rmmod
时,我得到了输出。
我做错了什么?我需要这个模块在启动时自动加载。
编辑:
这是输出,验证模块未在启动时加载,但它是一个有效模块。
/ # dmesg | grep "Hello"
/ # insmod hello.ko
[ 68.503689] Hello World!
/ # rmmod hello.ko
[ 72.702035] Goodbye Cruel World!
您应该将您的模块名称添加到您的食谱中的 KERNEL_MODULE_AUTOLOAD,通常是这样的:
KERNEL_MODULE_AUTOLOAD += "hello"
这应该将您的模块名称放入图像上的 /etc/modules-load.d/modname.conf 中。