驅動程式 - Linux Device Driver (LDD) - 使用範例 - Assembly (ARM) - KThread



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