用汇编语言编写Linux内核模块

我不喜欢被当今互联网产业吹嘘到比冥王哈迪斯还该死的所谓业务逻辑,我只喜欢机器本身,所以我不会编程,是的,这是报应。

我只会C语言和汇编,但是并不很。

但我觉得C语言编译器自动生成的那些push RBP之类的指令简直糟糕透了,所以我更喜欢更加纯粹的汇编。

我曾经是一个用Java写过界面的人,我也是一个直接用机器码打开别人开不了机的人,我是一个不懂UML但曾经动用过改锥编程的人,至少我崇拜那样的人。

本文,我来展示一个用汇编写的Linux内核模块,没有gcc生成的prologue & epilogue,也不用include那么一坨头文件,简单直接,请看:

; test.asm
global init_module
global cleanup_module

extern printk

section .data
    msg    db "浙江温州皮鞋湿,下雨进水不会胖\n", 32, 0

section .text

init_module:
    mov    rdi, $msg
    call printk
    xor rax, rax
    ret

cleanup_module:
    ret

Makefile如下:

obj-m += mod.o
mod-objs = test.o

KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
    nasm -f elf64 test.asm -o test.o
    make -C $(KDIR) M=$(PWD) modules

直接make,效果如下:

[root@localhost test]# dmesg
[ 1076.387265] 浙江温州皮鞋湿,下雨进水不会胖

试试看如何打印出当前的内核版本?

好办!

[root@localhost ~]# cat /proc/kallsyms |grep linux_banner
ffffffff8164c0e0 R linux_banner

代码如下:

global init_module
extern printk

section .text

init_module:
    mov    rdi, 0xffffffff8164c0e0
    call printk
    mov rax, -1
    ret

效果如下:

[root@localhost test]# insmod ./mod.ko
insmod: ERROR: could not insert module ./mod.ko: Operation not permitted
[root@localhost test]# dmesg
[ 1757.595004] Linux version 3.10.x86_64 (admin@2969c2e8d7c0) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) ) #1 SMP Thu Jan 25 10:26:17 CST 2018

浙江温州皮鞋湿,下雨进水不会胖!

原文链接: https://blog.csdn.net/dog250/article/details/106439269

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    用汇编语言编写Linux内核模块

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/405964

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午9:32
下一篇 2023年4月26日 上午9:32

相关推荐