본문 바로가기
Kernel/Practice

kwork 사용 例

by 暻煥 2024. 2. 2.

http://egloos.zum.com/rousalome/v/9990852

 

  • kernel work interface를 이용하여 worker thread를 생성하는 방법 (kernel module)
  • 매 1초마다 thread 실행

 

/*
 * example_work.c
 */
#include <linux/module.h>
#include <linux/workqueue.h>
#include <linux/types.h>

#define TEST_WORK_QUEUE_NAME "Test_Work_Queue"
#define TEST_WORK_PERIOD (1 * HZ) // every 1 sec

static ulong test_number_iteration;
static bool test_work_die;

static void test_work_handler(struct work_struct * wrk);

static struct workqueue_struct *test_workqueue;
static DECLARE_DELAYED_WORK(test_work, test_work_handler);

static void test_work_handler(struct work_struct *wrk)
{
    /*
     * DO SOMETHING
     */
    test_number_iteration++;

    if (!test_work_die)
        queue_delayed_work(test_workqueue, &test_work, TEST_WORK_PERIOD);

    return;
}

static int __init example_work_init(void)
{
    test_workqueue = create_workqueue(TEST_WORK_QUEUE_NAME);
    queue_delayed_work(test_workqueue, &test_work, TEST_WORK_PERIOD);

    return 0;
}

static void __exit example_work_exit(void)
{
    test_work_die = true;
    cancel_delayed_work(&test_work);
    flush_workqueue(test_workqueue);
    destroy_workqueue(test_workqueue);

    return;
}

module_init(example_work_init);
module_exit(example_work_exit);

MODULE_LICENSE("GPL");

 

아래는 arm64 kernel을 위한 Makefile

# must set kernel build output directory
export KERNEL_DIR=../out

export CUR_DIR=$(PWD)

TARGET_NAME=example_work
obj-m += $(TARGET_NAME).o

all:
    make ARCH=arm64 LD=aarch64-linux-gnu-ld CC=aarch64-linux-gnu-gcc -C ${KERNEL_DIR} KCFLAGS=$(KCFLAGS) $(EXTRA_CFLAGS) M=$(CUR_DIR) modules

clean:
    make ARCH=arm64 -C ${KERNEL_DIR} M=$(PWD) clean

.

'Kernel > Practice' 카테고리의 다른 글

misc device 例  (0) 2024.09.21
hrtimer 사용 例  (0) 2024.02.02
process 생성/종료 ftrace 얻기  (0) 2024.02.02
debugfs 생성 ( /sys/kernel/debug/)  (0) 2024.02.02
함수 ftrace 얻기  (0) 2024.02.02