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

assembly – 在汇编程序中编写x86_64 linux内核模块,第1张

概述我尝试在nasm中编写简单的内核模块(v3.6),但insmod说我: $sudo insmod ./hello.koinsmod: ERROR: could not insert module ./hello.ko: Invalid module format$echo $?1 我编译我的代码: $nasm -f elf64 -o hello.m hello.asm$ld -m elf 我尝试在nasm中编写简单的内核模块(v3.6),但insmod说我:
$sudo insmod  ./hello.koinsmod: 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",0section .data    init_mess    db "init_module",10,0    cleanup_mess db "cleanup_module",0section .text    global init_module    global cleanup_module    extern printkinit_module:    push rbp    mov rbp,rsp    xor rax,rax    mov rdi,init_mess    call printk    xor rax,rax    mov rsp,rbp    pop rbp    retcleanup_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_moduleglobal cleanup_module;extern printksection .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 systemsection __versions    ____versions      db   0xdf,0xbc,0xbf,0x8c,"module_layout"   ;from a .ko module of my system    align 64,db 0section .data    init_mess    db "init_module",0section .textinit_module:    xor rax,rax    retcleanup_module:    xor rax,rax    retsection .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_initasm_init:    xor rax,rax    ret

Makefile文件:

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

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

总结

以上是内存溢出为你收集整理的assembly – 在汇编程序中编写x86_64 linux内核模块全部内容,希望文章能够帮你解决assembly – 在汇编程序中编写x86_64 linux内核模块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1033250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存