new linux device driver - helloworld
github 程式碼
--
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
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
留言
張貼留言