当前位置:   article > 正文

新增Linux系统调用——计算一个数的三次方_vim编写立方函数

vim编写立方函数

新增Linux系统调用

  起初看到这个实验,完全是一脸懵啊,后来再看,依旧是一脸懵啊,再后来,借鉴了网上大佬们的教程,以及一天的时间折腾,终于完成了该实验。只是可惜了自己的电脑,CPU以80℃的温度运行一整天,好想对电脑说一句,下辈子别摊上我这个主了,找个好人家!!!哈哈哈!!!
  鉴于网上关于这方面的教程太过古老,以及教程过少,在此,记录一下,作为读者们的学习资料,也作为自己的学习笔记。


本文目录

  • 实验内容及要求
  • 实验步骤
    • 下载新内核
    • 修改新内核
    • 编译新内核
  • 实验测试
  • 总结

一、实验内容及要求

要求:

  • 需要重新编译Linux内核;
  • 增加一个Linux的系统调用;
  • 另外写一个程序进行调用。

功能:

  计算一个数字的三次方,并打印出来。

二、实验步骤

  本篇教程所需的实验环境为VMware Workstation 16 Pro + Ubuntu 20.04 。如果你的电脑不具备Linux环境,或者说并没有配置Ubuntu系统,可以参考博主之前的两篇文章——《VMware虚拟机安装Ubuntu》《VMware下Ubuntu的基本配置》

1.查看内核版本

打开【终端】,输入 uname -r,查看当前操作系统的内核版本。
在这里插入图片描述
此时我们看到的内核版本为 5.15.0-75

2.下载新内核

  内核下载的官网为 https://mirrors.edge.kernel.org/pub/linux/kernel/,选择需要下载的版本,下载即可。但是下载的速度真的如蜗牛爬一般啊,这里博主推荐使用国内镜像去下载,博主使用的是北京交通大学的开源镜像。(点击跳转)
  不建议使用最新的内核,建议使用老一点的内核,这样比较稳定些,不会因为内核的问题而导致编译出错。
  博主选择的内核版本为 5.6.8。

在【终端】中输入 wget https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/linux-5.6.8.tar.xz ,然后 回车
在这里插入图片描述
下载完成后,在主目录下便可以看到刚才下载的内核压缩包。
在这里插入图片描述

3.解压内核压缩包

在【终端】中依次输入以下命令:

  • tar -Jxvf linux-5.6.8.tar.xz
    在这里插入图片描述

下面的所有命令全在 ~/linux-5.6.8 目录下执行。

首先转到 ~/linux-5.6.8 目录下
在【终端】执行 cd linux-5.6.8/
在这里插入图片描述

4.新增Linux系统调用

(1)添加调用函数声明

终端】输入 vim include/linux/syscalls.h ,在 #endif 前输入 asmlinkage long sys_cube(int num);
在这里插入图片描述

注:
  执行完上面命令后,打开了一个头文件,此时vim处于命令模式,我们可以看见光标,但不可以编辑,移动光标到需要编辑的位置,按键盘上的【 i 】,进入编辑模式,待内容输入完成后,按【Esc】,切换至命令模式,此时输入【:wq】,即完成了保存退出操作。
在这里插入图片描述

(2)添加调用函数定义

终端】输入 vim kernel/sys.c ,在末尾 #endif 后输入如下函数:

SYSCALL_DEFINE1(cube,int,num){
    int result = num*num*num;
    printk("The result is %d.\n",result);
    return result;
}
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

在这里插入图片描述

(3)注册系统调用号

在【终端】输入 vim arch/x86/entry/syscalls/syscall_64.tbl ,在syscall_64.tbl文件中添加如下内容:
在这里插入图片描述
在这里插入图片描述
此时添加的自定义函数对应的系统调用号是 439


上面的过程已经添加了一个新的系统调用,下面的过程则是编译内核并安装新内核,可谓是本文的重点所在。

5.安装编译内核所需的依赖包

打开【终端】,依次输入下面命令:

sudo apt install make flex bison libssl-dev libelf-dev libncurses5-dev dwarves -y
  • 1

在这里插入图片描述

6.配置内核

(可选)【终端】输入 make mrproper ,用来清除以前配置,若是第一次配置,则不需执行此命令,博主是第一次编译,因此不执行该条命令。

终端】输入make menuconfig,在跳出的界面中依次执行【Save】—>【Ok】—>【Exit】—>【Exit】
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.编译

查看自己机器处理器的核数,可通过 cat /proc/cpuinfo 来查看。
在这里插入图片描述
此处的processor后面的数字表示的是处理器编号,只需要查看最大编号便可知道处理器的核数了。或者打开虚拟机设置,可通过查看硬件配置来查看处理器的核数,此处为8

在这里插入图片描述

在【终端】中键入 make -jn(n个线程开始编译),因为本文机器的处理器核数为8,故博主这里的命令是 make -j8 随后就是漫长的等待了,等到地老天荒,哈哈哈哈,大概一小时左右!

在这里插入图片描述
中途可能会报一些错误,我将其归纳在此,点击跳转

编译要结束时,如果看到下图所示的信息,说明你已经编译成功了,一定要看到此提示信息,因为有时候会内核编译停止,重启电脑后可能开不了机器。
若没有看到此条信息,建议继续make -j8一下。
在这里插入图片描述

8.安装编译好的模块

终端】键入sudo make modules_install 命令,完成模块的安装操作
在这里插入图片描述

这个命令执行也需要一定的时间,耐心等待就好。

9.安装内核

终端】输入 sudo make install
在这里插入图片描述

10.重启系统

在这里插入图片描述
重启过后,内核是自动选择刚编译的新内核,如果不是,则在重启过程中,按下shift键后,手动选择一下即可。

11.可能的错误

错误1

在这里插入图片描述

从错误信息可以看出,问题出在 debian/canonical-certs.pem 上面。首先,用vim打开内核的配置文件.config,
在这里插入图片描述
然后找到”debian/canonical-certs.pem“所在的位置,将其引号内容置空。
这是原始文件内容。
在这里插入图片描述
这是修改后的文件内容。
在这里插入图片描述


三、实验测试

  这部分是最激动人心的环节,它决定着你的努力,你的时间是否得到了回报,究竟是回报的迟到还是失败的重现?下面就跟着博主来见证一下啦!
  首先,查看一下内核版本是否为新安装的内核版本,然后再去编写程序验证程序的系统调用函数的正确性。

终端】输入 uname -r ,查看内核版本

在这里插入图片描述
从返回结果可以看出,已经成功安装了新内核,但系统调用是否有用,还得用程序验证一下:

(1)安装 gcc
在【终端】中输入 apt-get -y install gcc

(2)编写测试程序 test.c
在【终端】中键入 vim test.c ,此时新建了一个 test.c 的c文件,在文件输入以下内容:

include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
void main(){
        long a=syscall(439,4);
        printf("the result is %ld.\n",a);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
保存后退出,在【终端】中依次执行 gcc test.c -o test.out./test.out

在这里插入图片描述
result is 64. ,可以看出,内核编译是成功了!!!

四、可能的错误

  在实验过程中,出现了太多的错误,大多是因为没有安装一些相应的依赖包,以及系统调用函数的书写错误而导致,那都是博主的辛酸史,没有必要记录下来,读者们只需要按照上述步骤依次执行,就可以成功完成实验。
  在重启系统时,出现了下图错误(忘记截图了,从网上盗了一张),尝试了挺多的办法,最后从一博文中看到,修改虚拟机内存大小即可解决该问题,博主原先的是2GB,后来修改为4GB,果断解决了问题,成功进入新内核的Ubuntu系统。

在这里插入图片描述

五、总结

  很是欣赏专业老师的一句话,大抵是说,只有经过一段痛苦的折磨,才能够有所成长。的确,这两天不断在改内核,编译内核,其间不知翻了多少次车,一个个可能的错误不停地排除,浪费的时间主要是在内核编译上,一次修改后的重新编译差不多就是一小时,一天又有几个一小时呢?
  通过这次实验,对Linux系统的内核了解了一点,可能连皮毛也不算,但较之之前的一无所知,博主心中已是知足,在修改内核过程中,对vim的操作以及Linux的一些常规命令也更加熟悉了,相比之下,这才是我收获最大的地方,毕竟,从事IT行业,Linux是基础。


PS:

  • 注意本篇博文是在Ubuntu 20.04的基础上来写的,所有步骤在其上均可通过,博主又测试了Ubuntu 18.04,也可通过,但并不保证在所有的Linux系统上均可以无错误地通过;
  • 留给虚拟机的磁盘尽量大点,建议50GB起,磁盘空间不够也会引发未知错误;
  • 实验验证前面内容(内核编译)于2023年6月重新修正
  • 博文若有不妥的地方,欢迎读者们在评论区留言,博主一定改进;
  • 本文为博主原创文章,若要转载,请注明出处。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/238299
推荐阅读
相关标签
  

闽ICP备14008679号