Написание модуля ядра Linux x86_64 на ассемблере
Я пытаюсь написать простой модуль ядра (v3.6) в Nasm, но insmod сказать мне:
$ sudo insmod ./hello.ko
insmod: ERROR: could not insert module ./hello.ko: Invalid module format
$ echo $?
1
Я компилирую свой код с помощью:
$ nasm -f elf64 -o hello.m hello.asm
$ ld -m elf_x86_64 -r -o hello.ko hello.m
и мой код модуля:
section .modinfo
__mod_kernel_version db "kernel_version=3.6.8", 0
__mod_license db "license=GPL", 0
__mod_author db "author=actics", 0
__mod_description db "description=hello world module in nasm", 0
section .data
init_mess db "init_module", 10, 0
cleanup_mess db "cleanup_module", 10, 0
section .text
global init_module
global cleanup_module
extern printk
init_module:
push rbp
mov rbp, rsp
xor rax, rax
mov rdi, init_mess
call printk
xor rax, rax
mov rsp, rbp
pop rbp
ret
cleanup_module:
push rbp
mov rbp, rsp
xor rax, rax
mov rdi, cleanup_mess
call printk
xor rax, rax
mov rsp, rbp
pop rbp
ret
Пожалуйста помоги. В интернете я нашел 1 ссылку с равным кодом для 2.4, но он тоже не работает Моя система - archlinux с ядром 3.6.8
ОБНОВЛЕНИЕ: в форуме nasm я нахожу нить с интересным решением. Это работает для меня, если мой модуль возвращает 0 и завершает работу :) Но если я попытаюсь добавить "extern printk", insmod скажет мне следующее:
ERROR: could not insert module hello.ko: Invalid parameters
Что я делаю не так? мой код:
[bits 64]
global init_module
global cleanup_module
;extern printk
section .modinfo
__mod_description8 db 'description=Simple module',0
align 16,db 0
__mod_author7 db 'author=That´s me',0
__mod_license6 db 'license=GPL',0
align 16,db 0
__module_depends db 'depends=',0
align 32,db 0
__mod_vermagic5 db 'vermagic=3.6.8-1-ARCH SMP preempt mod_unload modversions ',0 ;from a .ko module of my system
section __versions
____versions db 0xdf, 0xbc, 0xbf, 0x8c, 0, 0, 0, 0, "module_layout" ;from a .ko module of my system
align 64,db 0
section .data
init_mess db "init_module", 10, 0
cleanup_mess db "cleanup_module", 10, 0
section .text
init_module:
xor rax, rax
ret
cleanup_module:
xor rax, rax
ret
section .gnu.linkonce.this_module
times 24 db 0
__name: db 'Simple', 0
times (0x168 - 24 - 7) db 0
__init_module: dq init_module
times 0x2ac db 0
__cleanup_module: dq cleanup_module
times 1152 db 0
этот код работает с: nasm -f elf64 hello.asm -o hello.o
но если я раскомментирую printk, это не работает!)