임베디드/Linux BSP

모듈 프로그램

O_oz 2024. 3. 11. 11:49
반응형

간단한 모듈 프로그램을 작성해보자

 

앞으로 모든 작업은 Ubuntu 20.04에서 소스 파일을 작성해 크로스 컴파일을 진행하고 생성된 모듈 프로그램을 라즈베리파이에서 실행한다

// hello.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int hello_init(void)
{
    printk("Hello, world\n");

    return 0;
}

static void hello_exit(void)
{
    printk("Goodbye, world\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");

커널에 모듈이 적재되면 module_init()으로 인해 hello_init이 실행되고

커널에서 모듈을 제거하면 module_exit()으로 인해 hello_exit가 실행된다

 

// Makefile
MOD := hello
obj-m := $(MOD).o

CROSS = ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
#KDIR := /lib/modules/$(shell uname -r)/build
KDIR := /home/ubuntu/pi_bsp/kernel/linux
PWD := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules $(CROSS)
    cp $(MOD).ko /srv/nfs
clean:
    rm -rf *.ko
    rm -rf *.mod.*
    rm -rf .*.cmd
    rm -rf *.o
    rm -rf modules.order
    rm -rf Module.symvers
    rm -rf $(MOD).mod
    rm -rf .tmp_versions

make를 실행하면 크로스 컴파일이 진행되고 .ko와 같은 모듈 파일이 생성되어 라즈베리파이로 복사된다

 

라즈베리파이에서 생성된 모듈 파일을 커널에 적재해보자

sudo insmod hello.ko

커널에서 제거할 때는 아래 명령어를 실행한다 (.ko는 입력하지 않아도 된다)

sudo rmmod hello

 

이렇게 모듈을 적재하고 제거했는데 print한 문자열이 보이지 않는다 왜 일까?

커널에서 프린트한 것이기 때문에 dmesg 명령어로 확인할 수 있다

 

 

 

디바이스 드라이버같은 커널 라이브러리를 객체 형태로 만들어 시스템 콜을 통해 리눅스 커널에 적재 요청을 하면, 커널은 해당 객체를 커널에 동적으로 링크시킴

insmod가 모듈로 작성한 커널 객체를 커널에 링크시키도록 도와주는 외부 유틸리티

lsmod : 커널에 적재된 모듈 목록을 보여줌

depmod : 모듈간 의존성 정보를 생성

modprobe : 모듈을 커널에 적재하거나 제거 / modules.dep 파일을 참조해 해당 모듈을 작동시키는 데 필요한 다른 모듈을 등록시킴

 

 

 

 

디바이스 드라이버에는 고정된 내부 변수값을 사용하는 경우가 많음

하지만 이런 변수 값의 변경이 필요할 경우에는?

모듈 매개변수라는 외부에서 변경할 수 있는 변수를 사용하면 된다

sudo insmod 모듈명 매개변수

이와 같이 사용할 수 있다

 

// hello_param.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/moduleparam.h>

static int onevalue = 1;
static char *twostring = NULL;

module_param(onevalue, int, 0);
module_param(twostring, charp, 0);

static int hello_init(void)
{
    printk("Hello, world [onevalue = %d, twostring = %s]\n", onevalue, twostring);
    return 0;
}

static void hello_exit(void)
{
    printk("Goodbye, world\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("Dual BSD/GPL");

Makefile은 위에 있는 거 사용하면 됨

 

sudo insmod hello_param.ko onevalue=0xff twostring="module_param test"

이렇게 실행하고 dmesg를 실행하면 파라미터가 반영된 메시지를 확인할 수 있다

반응형

'임베디드 > Linux BSP' 카테고리의 다른 글

리눅스에서 한글 글자가 깨질 때  (0) 2024.03.11
디바이스 드라이버 제어 방식  (0) 2024.03.07
디바이스 파일  (0) 2024.03.06
디바이스 드라이버  (1) 2024.03.05
NFS 파일 공유 시스템  (1) 2024.02.06