카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2019/01/05

buildroot 패키지를 사용해 리눅스 드라이버 모듈 추가.

buildroot 패키지를 사용해 리눅스 드라이버 모듈 추가.
외부 QEMU 커널 모듈 테스트

소스 트리 구조:
buildroot/: Buildroot 파일 시스템 사용.
kernel_module/: 외부 모듈 패키지 테스트
 config.in
 external.mk
 Makefile
 hello.c : 간단한 모듈 테스트 파일

1) 커널 모듈 환경 설정 파일
kernel_module/Config.in:
config BR2_PACKAGE_KERNEL_MODULE
        bool "kernel_module"
        depends on BR2_LINUX_KERNEL
        help
                Linux Kernel Module Cheat.

2) 외부 커널 모듈 선언
kernel_module/external.mk:
KERNEL_MODULE_VERSION = 1.0
KERNEL_MODULE_SITE = $(BR2_EXTERNAL_KERNEL_MODULE_PATH)
KERNEL_MODULE_SITE_METHOD = local
$(eval $(kernel-module))
$(eval $(generic-package))

3) 빌드 환경 구성
kernel_module/Makefile:
obj-m += $(addsuffix .o, $(notdir $(basename $(wildcard $(BR2_EXTERNAL_KERNEL_MODULE_PATH)/*.c))))
ccflags-y := -DDEBUG -g -std=gnu99 -Wno-declaration-after-statement

.PHONY: all clean

all:
    $(MAKE) -C '$(LINUX_DIR)' M='$(PWD)' modules

clean:
    $(MAKE) -C '$(LINUX_DIR)' M='$(PWD)' clean

4) 테스트할 모듈 코드 작성
kernel_module/hello.c:
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int myinit(void)
{
    printk(KERN_INFO "hello init\n");
    return 0;
}

static void myexit(void)
{
    printk(KERN_INFO "hello exit\n");
}

module_init(myinit)
module_exit(myexit)

테스트
cd buildroot
make BR2_EXTERNAL="$(pwd)/../kernel_module" qemu_x86_64_defconfig
echo 'BR2_PACKAGE_KERNEL_MODULE=y' >> .config
make BR2_JLEVEL="$(($(nproc) - 2))" all
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user

QEMU 접근 테스트
root
modprobe hello
modprobe -r hello

커널 dmesg 명령어로 메세지 확인
hello init
hello exit

커널 등록 흐름 키워드 정리, $(eval $(kernel-module)) external.mk 환경 변수를 통해 모든 것이 설정된다.
저 두개의 환경변수를 보고 modprobe가 /lib/modules/*/extra/hello.ko 포함 할 수 있다.
modprobe dep 명령어는 modules.dep에 대한 정보를 보고 모듈간 종속성을 확인한다.

종속 참고: https://nautiluslee.blogspot.com/2019/01/blog-post_5.html

시작시 모듈 자동 등록
BR2_ROOTFS_OVERLAY="../rootfs_overlay"
rootfs_overlay/etc/init.d/S99modules
modprobe

댓글 1개:

  1. 안녕하세요. 좋은 글 잘 읽었습니다.
    궁금한 사항이 있어 문의 드립니다.
    Embedded Linux는 OS 종류 같은 개념이 없는 건가요? Ubuntu나 Debian같은...
    Host PC에서는 어떤 OS를 깔던지 buildroot로 컴파일을 하면 생성되는 결과물은
    Host PC에서 어떤 OS를 깔았던 상관없이 결과물이 나오는 건지요?

    답글삭제