linux 内核模块添加系统调用

主要参考:https://blog.csdn.net/ThugKd/article/details/71001853

课设是通过编译内核的办法添加系统调用,缺点很明显,编译时间很长,大概1,2小时。我试了下直接把我虚拟机搞炸了。所以就试了另一种办法,通过编译内核模块添加系统调用

。当然前提是你的系统留出空闲系统调用号,因为这个调用号是写到内存的,你不重新编译是无法改的。

系统环境:

虚拟机 12 pro

系统 

有几点不同:

1 我查看虚地址,c中虚地址前要加0x

          查看虚地址要在root或者sudo,不然他会给你一个全0的地址,加了sudo就好了

2 没有看到预留的系统调用号

       在/usr/src/linux-headers-4.15.0-29/ 通过搜索找到 unistd_64.h

      命令:find  /usr/src/linux-headers-4.18.0-21/ -name unistd_64.h 

       注意:这里的4.18.0-21可能会有差别

3  unsupported instruction `mov'

     c文件修改 把movl修改movq,还有eax改为rax

    因为作者是32环境,我的是64位环境  asm默认32位

     至于网上说的什么-m32那就别试了

4 最后一步dmesg会输出很多,所以加-个过滤

Dmesg | grep  “hello”

下面的错误可能会出现,我第一次编译时出现,后来居然没了,重现也没成功

1  make时提示miss

     复制时tab问题

     我用的是kate编译器,修改如下

 

2 dereferencing pointer to incomplete type ‘struct task_struct’   current->thread.addr_limit = fs;

我用的kubuntu,make时出现

我们代码中用到current宏,虽然我们在文件中引入linux/sched.h但还是出错,我们根据错误定位到.h文件,在那里添加linux/sched.h就好了

这个错误让我以为找到bug了,激动了好一会儿,结果现在没错误了

3 insmod 加载模块后卸载不了

原因是你用了系统调用号,不是预留的那种。所以前一步查看系统预留号很重要

4 makefile注释是用#

 

效果截图:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值