Linux Device Driver >> Assembly (ARM)
kthread
參考資訊:
1. ldd
Thread是執行的最小單位,在多核CPU上,產生的Thread可以同時的運作,這意謂著使用Thread技術可以用來改善效能,但是,每個Thread間的資料同步則是另一個課題
使用步驟:
1. kthread_create_on_node()
2. wake_up_process()
3. kthread_should_stop()
4. kthread_stop()
ldd.S
.global init_module .global cleanup_module .section .modinfo, "ae" __UNIQUE_ID_0: .asciz "license=GPL" __UNIQUE_ID_1: .asciz "author=Steward Fu" __UNIQUE_ID_2: .asciz "description=Linux Driver" .section .data kthread_name: .asciz "mykthread" kthread_msg1: .asciz "kthread_handler++\n" kthread_msg2: .asciz "kthread_handler--\n" mykthread: .dcb 4 .align 2 .section .text kthread_handler: push {lr} ldr r0, =kthread_msg1 bl printk loop: bl kthread_should_stop cmp r0, #0 bne kthread_exit mov r0, #100 bl msleep b loop kthread_exit: ldr r0, =kthread_msg2 bl printk pop {pc} init_module: push {lr} ldr r0, =kthread_handler mov r1, #0 mov r2, #0xffffffff ldr r3, =kthread_name bl kthread_create_on_node ldr r1, =mykthread str r0, [r1] bl wake_up_process mov r0, #0 pop {pc} cleanup_module: push {lr} ldr r0, =mykthread ldr r0, [r0] bl kthread_stop pop {pc} .end
init_module: 產生多個Thread並且執行
kthread_handler: 列印字串
cleanup_module: 停止Thread執行
測試
# insmod /boot/main.ko kthread_handler++ # rmmod main kthread_handler--