驅動程式 - Linux Device Driver (LDD) - 使用範例 - Assembly (ARM) - Hello, world!



Hello, world!是一個相當經典的入門教學範例,從這個範例的框架,使用者可以一探Linux Kernel的精簡之美,當然,它主要表達的目的,更多是對於操作環境的熟悉

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 .text
msg_load:   .asciz "Hello, world!\n" 
msg_unload: .asciz "Unload it\n"

    .align 2
    .section .text
init_module:
    push {lr}
    ldr r0, =msg_load
    bl printk
    mov r0, #0
    pop {pc}

cleanup_module:
    push {lr}
    ldr r0, =msg_unload
    bl printk
    pop {pc}
    .end

init_module: 載入驅動程式時,系統會呼叫使用
cleanup_module: 卸載驅動程式時,系統會呼叫使用

Makefile

export ARCH=arm
export CROSS_COMPILE=/opt/gcc-4.9/bin/arm-linux-gnueabihf-
export AS=${CROSS_COMPILE}as

KERNEL=$(HOME)/kernel

obj-m += main.o
main-objs:= ldd.o

all:
	$(AS) -o ldd.o ldd.S
	make -C $(KERNEL) M=$(PWD) modules

clean:
	make -C $(KERNEL) M=$(PWD) clean

編譯

$ make
    arm-linux-gnueabihf-as -o ldd.o ldd.S
    make -C kernel M=hello modules
    make[1]: Entering directory 'kernel'
        AS [M]  hello/ldd.o
        LD [M]  hello/main.o
        Building modules, stage 2.
        MODPOST 1 modules
        CC      hello/main.mod.o
        LD [M]  hello/main.ko
    make[1]: Leaving directory 'kernel'

main.ko放到MicroSD第一分區,進入系統後,執行如下指令

# insmod /boot/main.ko 
    Hello, world!

卸載驅動程式

# rmmod main
    Unload it