linux添加系统调用

介绍

就是添加一个自定义的系统调用,类似于read write这种

环境

linux-5.12.6-arch1-1.0
内核:linux-5.12.6
下载地址:www.kernel.org

修改

大概有5个文件需要修改
kernel/sys.c
include/linux/syscalls.h
include/uapi/asm-generic/unistd.h
arch/x86/entry/syscalls/syscall_64.tbl
arch/x86/entry/syscalls/syscall_32.tbl

定义系统调用

打开文件

vim kernel/sys.c

添加一下代码

SYSCALL_DEFINE1(mycall, int __user* ,arg)
{
	printk("this is mycall\n");
	return 0;
}

声明系统调用

打开文件

vim include/linux/syscalls.h

添加

asmlinkage long sys_mycall(int __user* ,arg);

添加对应编号

打开文件syscall_64.tbl

vim arch/x86/entry/syscalls/syscall_64.tbl

最后编号处添加

xxx	common	mycall		sys_mycall

这里的xxx是编号,自行修改

打开文件vim arch/x86/entry/syscalls/syscall_32.tbl

vim arch/x86/entry/syscalls/syscall_32.tbl

最后编号处添加

xxx	i386	mycall		sys_mycall

这里的xxx是编号,自行修改

unistd.h修改

#define __NR_mycall xxx
__SYSCALL(__NR_mycall, sys_mycall)

然后修改下边的总值

#define __NR_syscalls xxx+1

这里的xxx是编号,自行修改

配置

make clean && make mrproper
make localmodconfig #这里直接两下回车
make menuconfig #回车然后修改下边Bzip2
make -j16
make modules_install
cp -v arch/x86/boot/bzImage /boot/vmlinuz-5.12.6
cp System.map /boot/System.map-5.12.6
mkinitcpio -k 5.12.6 -g /boot/initramfs-5.12.6.img
grub-mkconfig -o /boot/grub/grub.cfg

然后就可以重启了,重启通过高级选项进入刚刚编译好的内核

测试

#include <stdio.h>
#include <stdlib.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
	//这里xxx是刚刚传的数字
	syscall(xxx, NULL);
	return 0;
}

打印结果

this is mycall

ps:如果参数为结构体记得在syscalls.h中声明一下

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值