Ubuntu(乌班图)系统添加一个任意的系统调用

给Ubuntu(乌班图)系统添加一个任意的系统调用

这篇博客是在我全部做完才写的,因为自己反反复复做了好几遍,所以先写一点建议,以免大家犯和我一样的错。

  1. 在装虚拟机的时候要找好版本,我第一次的版本有问题?总是会出现这样那样的错误,那些相关的编译程序我每次都要更新,还很慢,后来才发现好像是版本的原因。
  2. 一些命令行要准确输入,有时候输入少一个空格都会出现很多问题,我在写那个系统调用的时候因为括号不匹配,在编辑内核的时候出现了错误,大概2次之后我才发现了问题,所以,在写的时候一定要注意。
  3. 试着去了解Ubuntu系统的命令,知道之后才会理解这样做的原因,出现问题的时候可以找到问题所在。
  4. 在解压内核和安装vim编辑器的时候可以开启两个终端,一些其他操作也可以多开几个终端(有的可以,有的不行),这样好像可以快一点。
  5. 因为需要更新编译程序,所以尽量选择网好的时间段去完成这步操作,否则,你可能需要花费大量时间在下载这些程序上面。一般更新的时候都要yes,以防止后面会出现什么问题。
  6. 每次输入指令的时候都要是在正确的状态下,也就是说,在一些东西没安装完就输入一些命令,后面就会有错误,结果只能从头再来,正确的状态就是:在root权限下,就是回到之前输命令的状态。
  7. 这条是听同学说的:安装系统的时候内存3GB以上,硬盘40GB以上就可以了,我怕出错,是60GB。还有就是处理器数量设成4(4不行的话就2),每个处理器的内核数量是2,这个是防止后面改内核时内存不够。
  8. 在输命令之前确保已经获得root权限,否则后续会出现问题,比如后面报错,无法获得权限。
  9. 最后,如果问题实在解决不了,就从头开始,从装系统开始。

以下正文

第一眼看这个作业,无从下手。
用老师的话来说,添加一个系统调用并不难,难的是你要去改变它的内核。
但是,对我来说,添加系统调用也难,我对Linux系统的一些命令都不熟悉,甚至不知道。
之前尝试过装双系统,Ubuntu装上了,Windows系统被删掉了,所以这次果断虚拟机(然而还是出现了问题)。
开始做的时候在网上看了很多教程,但是对一些东西还是很模糊,有的还不清楚。所以,先从简单地概念开始入手。

操作系统:在Linux的术语中被称为"内核",也可以称为"核心"。Linux内核的主要模块分这部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的引导、系统调用等。

系统调用:用于实现各种系统功能的子程序。用户可以通过系统调用命令在自己的应用程序中调用它们。系统调用和普通函数调用很相似,普通的函数调用由函数库或用户自己提供,运行于用户态系;系统调用由操作系统核心提供,运行于核心态。

前面的一些准备工作:

  • 1.安装虚拟机
  • 2.安装系统
  • 3.下载内核
  • 4.安装VMware Tools

系统调用以及内核修改:

  1. 安装一些编译程序:(网好的时候第一个很大,后面几个还好)
    sudo apt-get install build-essential kernel-package libncurses5-dev
    sudo apt-get install libncurses5-dev libssl-dev
    sudo apt-get install build-essential openssl
    sudo apt-get install zlibc minizip
    sudo apt-get install libidn11-dev libidn11
    sudo apt-get install bison flex

  2. 内核
    将下载好的linux-5.1.tar.xz拖到Ubuntu桌面上(已经安装了VMware Tools,否则移不进去)
    在终端输入sudo mv /home/lxy/桌面/linux-5.1.tar.xz /usr/src/(xz后面有空格,所有的空格都不能少)

  3. 解压和安装vim(两个终端同时进行)
    解压:
    cd /usr/src
    sudo tar -xvf /usr/src/linux-5.1.tar.xz
    安装vim:
    cd /usr/src/linux-5.1/kernel
    sudo apt-get install vim

  4. 编辑文件,添加函数
    打开sys.c:
    cd /usr/src/linux-5.1/kernel
    vim sys.c
    添加函数(随意的):
    vim快捷键: i进入编辑,esc退出编辑状态, G跳到末尾, :wq保存退出(编辑完一定要保存)
    asmlinkage long sys_lxytest(void)
    {
    printk(“I am luxingyue ”);
    return 1;
    }
    Ubuntu(乌班图)系统添加一个任意的系统调用_第1张图片

  5. 添加声明
    进入syscalls.h:
    cd /usr/src/linux-5.1/arch/x86/include/asm/
    vim syscalls.h
    添加声明:
    asmlinkage long sys_lxytest(void);

Ubuntu(乌班图)系统添加一个任意的系统调用_第2张图片

6.编辑ID:
进入syscalls._64.tbl:
cd /usr/src/linux-5.1/arch/x86/entry/syscalls
vim syscall_64.tbl
编辑ID(最后那个千万不要模仿上面加_否则会编辑内核时出错):
335 64 lxytest sys_lxytest
Ubuntu(乌班图)系统添加一个任意的系统调用_第3张图片
7.配置:
在终端依次输入:
cd /usr/src/linux-5.1
sudo make mrproper
sudo make clean
sudo make menuconfig

将General setup内的Local version修改成新的名称,保存后自动退出(保存,点击Exit3次,点ok点击)。

8.编译(等等等,我大概一个半小时):
输入: make -j4(或j2,看之前的那个处理器数量)
完的标志:出现root权限。
Ubuntu(乌班图)系统添加一个任意的系统调用_第4张图片

9.安装(等待时间也比较长):
make modules_install
make install
然后重新启动系统。

新内核

依次输入以下指令,就可以看到结果(第二张为test.cpp源码,第三张为最终结果)

Ubuntu(乌班图)系统添加一个任意的系统调用_第5张图片

Ubuntu(乌班图)系统添加一个任意的系统调用_第6张图片

在这里插入图片描述

结束

最后,写一下我在完成这个作业时候遇到的问题。

1.在安装编译程序的时候,会出现 Unable yo locate package XXX
解决:终端输入(一般可以解决)
sudo apt-get update
sudo apt-get upgrade

2.在编写自己添加的调用函数时,中英文符号不匹配,导致编译失败。
解决:重新写函数,printk()函数里的字是粉色的,应该就可以了。

最后的最后,感想这2个博主
weixin_42757817
HeJ_Xing_
他们写的超详细,我就是查阅了他们写的才完成此作业。

你可能感兴趣的:(操作系统)