new linux device driver - helloworld

github 程式碼



1. __init / __exit

    __init 是定義在 include/linux/init.h (/usr/src/include-headers-xxx/ 下)
   
    #define __init __section(.init.text)
    #define __exit __section(.exit.text)

    主要是告訴 linker 把這段程式 放到哪個 section

ko 檔屬於 ELF 格式 (Executable and Linkable Format) 
可以用 objdump -x helloworld.ko 觀察

--
helloworld.ko:     file format elf64-x86-64
....
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  2 .init.text    00000014  0000000000000000  0000000000000000  00000064  2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  3 .exit.text    0000000c  0000000000000000  0000000000000000  00000078  2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
...
0000000000000000 l     F .init.text 0000000000000014 hello_init
0000000000000000 l     F .exit.text 000000000000000c hello_exit

,text 主要放的是程式的主體
可以看到 hello_init 被放在 section init.text, hello_exit 被放在 .exit.text

--
編譯
github

有 Makefile, 上述程式放在 src/ 下.
打 make 會編譯, 產生 helloworld.ko 在 src/內

--

執行

$sudo dmesg -c
$sudo insmod helloworld.ko
$sudo dmesg -c

Hello world!

$sudo rmmod helloworld
$sudo dmesg -c
How're you doing

留言

熱門文章