С учетом самого базового c модуля ядра
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/printk.h>
static int __init my_mod_init(void) {
printk("Hello World!");
printk("Goodbye World!");
return 0;
}
static void __exit my_mod_exit(void) { }
module_init(my_mod_init);
module_exit(my_mod_exit);
MODULE_LICENSE("GPL");
G CC создает следующую сборку armv7 (objdump)
dummy.ko: file format elf32-littlearm
Disassembly of section .init.text:
00000000 <init_module>:
0: e92d4010 push {r4, lr}
4: e3000000 movw r0, #0
8: e3400000 movt r0, #0
c: ebfffffe bl 0 <printk>
10: e3000000 movw r0, #0
14: e3400000 movt r0, #0
18: ebfffffe bl 0 <printk>
1c: e3a00000 mov r0, #0
20: e8bd8010 pop {r4, pc}
Disassembly of section .exit.text:
00000000 <cleanup_module>:
0: e12fff1e bx lr
Секция rodata выглядит следующим образом:
Contents of section .rodata.str1.4:
0000 48656c6c 6f20576f 726c6421 00000000 Hello World!....
0010 476f6f64 62796520 576f726c 642100 Goodbye World!.
Я по крайней мере ожидал, что r0
в строках 0x10 и 0x14 будет что-то вроде mov r0, #16
или ldr r0, [pc, #12]
. Как вторая printk
функция сообщает для печати "Прощай, мир!" ?