Ubuntu系统添加系统调用指令(虚拟机)

一.简介

   最近在学操作系统原理这门课,老师也是给我们留了个在Ubuntu系统上添加系统调用指令的作业。之前我也没想到会这么早就接触到了Linux系统的内核,但是想要了解Linux系统,的确也得先从内核开始了解。由于自己也是比较慌的,就不敢直接用之前装的Ubuntu系统里动手,而是选择了先在虚拟机中练练手,之后再到Ubuntu系统中去实战。
   下面的内容是基于虚拟机中安装的Ubuntu系统实现的,如果还不会在虚拟机安装系统的话,可以先看一下我之前的博客!!!

   虚拟机的安装请参考:请点击此处
   双系统的安装请参考:请点击此处

二.准备工作


   1.装有Ubuntu系统的虚拟机
   2.Linux系统内核
   具体虚拟机中Ubuntu系统的配置见我之前的那篇博客,只是我设置的硬盘空间是60GB,由于编译内核比较耗CPU,我也将内存容量改为4GB,CPU数量改为4个,其他的都是默认安装。具体虚拟机中Ubuntu系统默认安装的是英文,安装完后可更改语言首选项,这个比较简单,这里就不赘述,英语比较好的就用英文的也行。我同时也安装了VWware Tools,便于在虚拟机与主机中传输文件。安装Vmware Tools 的过程也比较简单,打开虚拟机之后,在上方的查看菜单中选择安装VMware Tools,然后在系统中找到VMware Tools的存放路径,在那儿右键打开终端,输入 mv VMwareTools-10.3.2-9925305.tar.gz /home/wzm/下载 (压缩文件的名字可能有所不同,wzm是我系统的用户名,具体根据自己的来),然后在下载文件夹中右键单击压缩文件,直接提取到此处,然后打开文件夹,找到vmware-install.pl 文件,此处右键打开终端,输入 sudo ./vmware-install.pl,输入密码即可。虚拟机的相关配置都比较简单,就不配图了。

内核下载:https://www.kernel.org/ 在这里插入图片描述
如果安装了VMware Tools的话,可以在Windows系统下下载好内核文件,然后直接鼠标拖到Linux系统桌面上去,当然也可以直接在Linux系统下直接下载,我用的是前者。准备好如下:在这里插入图片描述

三.具体实现过程


   1.(个人爱好先切换到root用户)
   直接在桌面上打开终端即可,输入
    sudo su
   enter之后输入密码即可,Ubuntu系统中输入密码自己是看不见的,不要以为没输进去,输入完密码enter即可

   2.准备各种软件包
   sudo apt-get install build-essential kernel-package libncurses5-dev
   如果出现软件包依赖库错误,可把软件与更新设置中的其他软件都勾上,,如下勾选在这里插入图片描述

   3.将linux-4.19.36.tar.xz移动到/usr/src/文件夹中去
   sudo mv /home/wzm/桌面/linux-4.19.36.tar.xz /usr/src/

   4.解压内核文件
   cd /usr/src
   sudo tar -xvf /usr/src/linux-4.19.36.tar.xz

   5.进入解压文件
   cd /usr/src/linux-4.19.36/kernel

   6.安装vim编辑器
   sudo apt-get install vim

   3-6步骤的过程如下图,中间有一步解压的过程我之前已经解压了就没输入
在这里插入图片描述

   7.编辑sys.c文件
   这里简要介绍一下vim编辑器的使用,vim编辑器的使用比较复杂,但是一旦熟练之后vim编辑器将会显得格外的方便。这里只涉及到几个简单的操作:
   1.用vim打开某个文件之后,比如vim sys.c,将会看到sys.c里面的内容,但是无法编辑,此时先找到之后要改动的位置,G 表示到最后一行,之后按 i 进入编辑模式
   2.编辑好后,按esc键退出编辑模式,然后输入 : , 再输入wq表示保存并退出,q 仅仅表示退出。

   vim sys.c

最末尾加入,注意我加的位置

在这里插入图片描述

asmlinkage long sys_wzmtest(void){
	printk("This is a test of my. I am wzm.");
	return 1;
}


   8.编辑syscalls.h文件
   cd /usr/src/linux-4.19.36/arch/x86/include/asm/
   vim syscalls.h

最末尾加入,注意我加的位置
   最后一行添加  asmlinkage long sys_wzmtest(void);

在这里插入图片描述

   9.编辑syscall_64.tbl文件
   cd /usr/src/linux-4.19.36/arch/x86/entry/syscalls
   vim syscall_64.tbl

   后面添加 335  64  wzmtest   sys_wzmtest
   (335表示自己添加的系统指令的序号)

注意我加的位置,是上面的那一块后面

在这里插入图片描述

   10.准备编译内核
   cd /usr/src/linux-4.19.36/
   make mrproper
   make clean
   make menuconfig
   可将General setup改为自己内核的名字,我的改为了wzmtest在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

   11.编译内核
   make -j4
   这一步最为核心,耗时最长,数字 4 指的是cpu的数量,我虚拟机中配置的cpu数量为4个,之前有说

   12.安装内核
   make modules_install
   make install

   之后重启就行

   13.调用系统指令
   uname -r
   查看使用的内核
   结果显示使用的正是自己刚刚编译好的内核,表示Ubuntu系统的“心脏”已经更换完毕,到这里就表示已经完成了一大半了呢
在这里插入图片描述
   桌面上打开终端,输入vim test.cpp,写入一下内容在这里插入图片描述

#include<iostream>
#include<linux/kernel.h>
#include<syscall.h>
#include<unistd.h>
using namespace std;
int main(){
	cout<<"System call sys_wzmtest has been used."<<endl;
	long a=syscall(335);
	cout<<"System call sys_wzmtest return : "<<(int)a<<endl;
	syscall(335);
	return 0;
}

   然后g++ test.cpp,会在当前文件夹中生成a.out文件在这里插入图片描述   然后
   ./a.out
   执行刚刚生成的a.out文件
   可以看到返回值为1,正是我新增的系统指令的返回值,这就说明已经成功了。可能会觉得没有看到输出的语句就有点慌,别急,继续往下看吧!
在这里插入图片描述

注意千万不要直接a.out,而应该输入./a.out,会发现返回值为1
   可以发现我之前新增的系统指令的那个函数中有个输出语句,然鹅在程序中调用时并没有显示出输出的内容。 原因是我的系统指令中用的是printk(); 而printk()是由于优先级的问题并不一定能够写到终端上来的。想看到那条输出语句的话,得在日志文件中查看,执行
    dmesg

在这里插入图片描述

四.问题解决

   问题1.apt-get install build-essential kernel-package libncurses5-dev 出现软件包依赖库无法下载的问题
       解决方案已经写在文章中,修改系统相关选项即可
   问题2.执行 make mrproper 时显示找不到make命令
       apt-get install make
   问题3.执行 make menuconfig 时报错
       错误类型为缺少某些库安装即可,比如 apt-get install bison flex
       错误类型为recipe for target ‘menuconfig’ failed并且库已经安装时,建议重新下载内核重来,网上有些是说终端太小。我当时也出现了这个问题,但把终端放大也没用,重新下载内核再弄一遍就好了。
   问题4.编译内核过程中出现无法找到的声明
       我当时出现这个错误的原因是因为我在修改syscall_64.tbl文件时写的是模仿上面的写的__x64_sys_wzmtest,然后改为sys_wzmtest再编译一遍就没问题了。

五.感想

   在这次自己编译内核添加系统指令的过程中,真的是弄得有点心累。其实一路顺风的话,也就是什么问题都没出,那真的是可以令自己激动好几天了的。而我自己当时真的是想哭,感觉网上各种问题我都出现了,关键是网上的说法各种不统一,有时候一个小小的问题得看十几篇博客才能解决,有时还解决不了只能重来了。
   虽说自己折腾这东西的时候弄了整整一天,但是收获也是蛮大的。这也算是自己开始接触Linux系统内核的第一步吧,感觉自己逐渐喜欢上了Linux系统上的终端界面!!!最后,很感谢网上那些分享自己问题的解决方案的博客主们。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值