操作系统实验:在Linux中增加系统调用

操作系统实验:在Linux中增加系统调用

环境:Ubuntu 16.4 + VMware,新下载内核为:4.19

关于内核的编译和更改grub就不赘述了,在我原来的博客中有提到过:操作系统作业(一):Linux内核编译

整个系统调用的图解:

调用N号系统调用,使用指令: SVC N

  • N:系统调用的编号

  • SVC: SuperVisor Call,访管指令

  • SVC是中断指令

操作系统实验:在Linux中增加系统调用_第1张图片

第一步:还是原来的操作下载内核:4.19,当然用原来已有的内核也是一样的

cd /usr/src/linux-4.19.30 #我把新下载的内核放在了/usr/src/目录下

第二步:添加函数声明

gedit ./include/linux/syscalls.h

为了保险起见我把新添加的函数声明放在了注释为/* sys.c */的文件下面

操作系统实验:在Linux中增加系统调用_第2张图片

第三步:添加这些新函数的定义

gedit ./kernel/sys.c 

在其中添加:

asmlinkage long sys_hello(void)

{

   printk(“Hello, world!);

   return 0;

}

asmlinkage是表示所有函数中参数在栈中都存在的关键词

除了向上面这样定义函数,还能用SYSCALL_DEFINEx来定义,x表示有几个外部参数,具体写法参考:https://blog.csdn.net/lzq_cnqf/article/details/83148013

第四步:添加系统调用号

在终端输入输入

sudo gedit ./arch/x86/entry/syscalls/syscall_64.tbl 

看到下面的图片

操作系统实验:在Linux中增加系统调用_第3张图片

我决定加入三个系统调用函数分别为,注意:系统调用号一定不能和原来的一样

335	64	hello		sys_hello     //输出hello word
336	64	copy_file	sys_copy_file	//复制文件
337	64	print_file	sys_print_file	//打印文件

之后保存

系统调用号的作用是:根据系统调用号来查找这个调用函数的入口地址

第五步:编写调用系统函数的c函数

#include

#include

#include

#include

int main()

{

       long use = syscall(335)printf(“System call sys_hello: %ld\n”,use);

       return 0;

}

第六步:编译安装内核

教程:操作系统作业(一):Linux内核编译

第七步:测试

输入 gcc -o hello.c./hello查看运行结果

发现打印出“System call sys_hello:0”,运行成功

然后用命令dmesg查看结果

在这里插入图片描述

完全没有问题

最后还是有点不明白为什么这个Linux函数写的挺别扭的。。。附上我学习的参考链接:Linux系统调用详解

你可能感兴趣的:(学习,操作系统原理)