Написание модуля ядра 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 я нахожу нить с интересным решением. Это's работает для меня, если мой модуль вернет 0 и выйдет :) Но если я попытаюсь добавить "extern printk " Инсмод сказал мне следующее:

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, это не работает!)

Ответы на вопрос(1)

Ваш ответ на вопрос