![](/img/trans.png)
[英]Writing a putchar in Assembly for x86_64 with 64 bit Linux?
[英]Writing x86_64 linux kernel module in assembler
我嘗試在 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", 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 這不起作用!)
我所做的是使用標准模塊宏編寫一個小型 C 包裝器,並將其與用 asm 編寫的主模塊代碼鏈接起來。 使用正常的內核構建系統來構建它。
模塊.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);
主要匯編程序:
[bits 64]
global asm_init
asm_init:
xor rax, rax
ret
生成文件:
obj-m += test.o
test-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: main.asm
nasm -f elf64 -o $@ $^
obj-m += memory_asm.o
memory_asm-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: $(src)/main.asm
nasm -f elf64 -o $@ $^ && echo "" > $(src)/.main.o.cmd
使用命令構建: make -C <path_to_kernel_src> M=$PWD
將 Makefile 更改為:
obj-m += memory_asm.o
memory_asm-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: $(src)/main.asm
nasm -f elf64 -o $@ $^ && echo "" > $(src)/.main.o.cmd
k 你必須使用 gcc 來編譯它 k 並將它鏈接到內核目錄...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.