HelloWorld 커널 모듈 예제와 yocto 레시피를 작성하고 모듈을 적재 및 제거하는 내용을 다룬다.
개발환경: 우분투 리눅스 18.04, yocto
타겟: wandboard (i.MX6)
NXP에서 제공하는 욕토 레이어 meta-freescale, meta-freescale-3rdparty, meta-freescale-distro 를 사용할 수 있다.
이글은 간단한 커널 모듈을 적재하는 방법을 설명할 것이며 이미지는 아주 작은 것을 사용한다. 다음의 명령으로 이미지를 빌드 할 수 있다.
meta-freescale-3rdparty 레이어에 레시피 추가
위에서 언급한 레이어에 간단한 커널 모듈을 위한 레시피를 추가하려한다. 먼저 적당한 이름의 디렉토리를 만든다.
<your source path>/meta-freescale-3rdparty/recipes-kernel$ mkdir hello-module
$ cd hello-module
레시피 작성
hello-module.bb
#
# Yocto recipe to build a kernel module out of the kernel tree
# hello-module.bb
# www.makersweb.net
#
DESCRIPTION = "Hello kernel module out of the kernel tree"
SECTION = "examples"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"
PR = "r0"
inherit module
SRC_URI = "file://hello.c \
file://Makefile \
file://COPYING \
"
S = "${WORKDIR}"
$ mkdir files
$ cd files/
모듈 프로그램 작성
hello.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static int __init hello_init(void)
{
printk("Hello World!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk("Good bye!\n");
}
module_init(hello_init); // when insmod
module_exit(hello_exit); // when rmmod
MODULE_LICENSE("GPL v2");
Makefile 작성
Makefile
obj-m += hello.o
SRC := $(shell pwd)
all:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules
modules_install:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
clean:
rm *.o
디렉토리 구조
hello-module
├── files
│ ├── COPYING
│ ├── hello.c
│ └── Makefile
└── hello-module.bb
해당 레시피를 빌드
$ bitbake hello-module
빌드된 모듈 위치 찾기
$ bitbake -e hello-module | grep ^WORKDIR=
모듈을 이미지에 포함시키기
<build dir>/conf/local.conf 파일에 다음 라인 추가
IMAGE_INSTALL_append = " hello-module"
이미지 다시 빌드
$ bitbake core-image-minimal
이미지를 sd메모리에 쓰고 부팅
hello-module은 /lib/modules/4.9.67-fslc+g953c6e30c970/extra 에서 찾을 수 있다.
모듈 적재 및 제거