如何给linux添加一个系统调用

1、 准备工作

a. 安装相关编译程序

sudo apt-get install build-essential kernel-package libncurses5-dev

注:我这里是之前已经安装完了
在这里插入图片描述

b. 获取内核源代码

可以在官网下载,下面附上国内比较好用的下载地址。
内核源代码下载网站 http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v4.x/
这里我下载的是:linux-4.16.tar.gz
在这里插入图片描述
将源代码移动到 /usr/src/

sudo mv /xx/xx/linux-4.16.tar.gz /usr/src/

c. 解压源代码

cd /usr/src
sudo tar -zxvf /usr/src/linux-4.16.tar.gz
# -z 调用gzip程序来压缩、解压文件,文件名称以tar.gz结尾
# -j 调用bzip2程序来压缩、解压文件,文件名称以tar.bz2结尾

2、编辑 sys.c 加入函数

# 使用gedit 打开sys.c文件
sudo gedit /usr/src/linux-4.16/kernel/sys.c

在文件末尾添加如下函数,并保存,在终端窗口按`ctrl + c’ 退出

asmlinkage long sys_helloworld(void) {
	printk("hello world!");
	return 1;
}

在这里插入图片描述

3、添加声明

# 打开 /usr/src/linux-4.16/arch/x86/include/asm/syscalls.h
sudo gedit /usr/src/linux-4.16/arch/x86/include/asm/syscalls.h

插入如下声明

asmlinkage long sys_helloworld(void);

在这里插入图片描述

4、添加系统调用id

# 打开 /usr/src/linux-4.16/arch/x86/entry/syscalls/syscall_64.tbl
sudo gedit /usr/src/linux-4.16/arch/x86/entry/syscalls/syscall_64.tbl

添加如下行

333     64      helloworld		sys_helloworld

在这里插入图片描述

5、配置内核

cd /usr/src/linux-4.16
sudo make mrproper
sudo make clean
# make menuconfig 时将general setup  ->  localversion 修改成新的名称,如 “wikiKernel”
sudo make menuconfig

# 编译线程越多,速度越快,我这里是8核8线程
make -j8

# 编译过程中出错的话,一般是缺依赖包,缺什么补什么即可
# 我编译过程中缺少了 libssl-dev, 于是执行如下命令后继续编译
sudo apt-get install libssl-dev

# 继续编译
make -j8

编译成功截图

6、安装内核

sudo make modules_install
sudo make install

安装成功截图
在这里插入图片描述

7、重启虚拟机

将之前的工作保存后直接重启,重启后点击鼠标进入ubuntu并且迅速长按shift,进入内核选择界面
在这里插入图片描述
选择 Advanced options for ubuntu,选择你编译好的内核,enter进入
在这里插入图片描述

8、验证

新建文件,输入如下代码

#include <stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>

int main()
{
	long int a = syscall(333);
	printf("System call sys_helloworld return %ld\n", a);
	return 0;
}
# 编译
gcc hello.c

打开另一个终端查看内核日志

dmesg -wH | grep "hello"

运行

./a.out

效果截图
在这里插入图片描述

  • 8
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值