Steward
分享是一種喜悅、更是一種幸福
驅動程式 - 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | . 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--