我尝试在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