assembly – 在汇编程序中编写x86_64 linux内核模块

我尝试在nasm中编写简单的内核模块(v3.6),但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",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,cleanup_mess
    call printk

    xor rax,rbp
    pop rbp
    ret

请帮忙.在互联网中,我找到了1个与2.4相同代码链接,但他也没有工作
我的系统 – 带有3.6.8内核的archlinux

更新:
在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',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,"module_layout"   ;from a .ko module of my system
    align 64,db 0

section .data
    init_mess    db "init_module",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这没有用!)

解决方法

我所做的是使用标准模块宏编写一个小的C包装器,并将其与用asm编写的主模块代码链接起来.使用普通的内核构建系统来构建它.

的module.c:

#include <linux/module.h>
MODULE_AUTHOR("A. U. Thor");
MODULE_DESCRIPTION("Description");
MODULE_LICENSE("GPL");
extern int asm_init(void);
int main_init(void)
{
    return asm_init();
}
module_init(main_init);

main.asm中:

[bits 64]
global asm_init
asm_init:
    xor rax,rax
    ret

Makefile文件

obj-m += test.o
test-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: main.asm
        nasm -f elf64 -o $@ $^

使用命令构建:make -C< path_to_kernel_src> M = $PWD

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...