
- 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 |