操作系统项目:向Linux内核添加一个系统调用

内容

  1. 向Linux增加一个系统调用
  2. 撰写一个应用测试程序调用该系统调用
  3. 使用ptrace或类似的工具对该测试程序进行跟踪调

 环境

1.vmware workstation 15.0.0

2.ubuntu-18.10-desktop

3.linux-4.18.14

 

步骤

一.准备环境

在终端操作:

sudo apt-get update  //更新系统源码 

sudo apt-get install vim //安装vim

sudo apt-get install libncurses5-dev libssl-dev  //下载依赖包

sudo apt-get install libelf-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 flex bison

 二.构建新内核

 1.准备

  在www.kernel.org下载linux-4.18.14.tar.gz

    解压

将在官网下好的内核直接拉到ubuntn里,然后将压缩包用指令移到/usr/src目录下(过程需要root权限)。

       sudo su                                            //获取root

  sudo mv  压缩包位置    /usr/src         //移动文件

     cd  /usr/src                                  //切换到该目录下进行操作

      sudo tar -xvflinux-4.18.14.tar.gz     //解压

 2.添加系统调用

先将目录切换到解压后的内核里操作

  1. sudo vim  kernel/sys.c   //添加自己的函数   

这里添加了sys_helloworld

 

          2.sudo vim arch/x86/include/asm/syscalls.h //添加声明  

  

               3.sudo vimarch/x86/entry/syscalls/syscall_64.tbl  //添加调用号

 

3.删除无用的文件

sudo make mrproper

sudo make clean

4.配置 

sudo make menuconfig  

此处直接save,exit即可,无需修改

 

5.编译新内核并安装

A.编译    

sudo make -j2  //将处理机内核总数调整为4,会明显加快编译速度

 

(-j2为开启双线程编译)

B.安装

sudo make modules_install  

sudo make install

6.重启

//reboot

三.测试  

先使用vim写一个测试的cpp

 

 

之后gcc编译(前提是apt-get install build-essential安装gcc/g++/gdb/make 等基本编程工具。)

然后运行

 

demsg   查看进程信息

 

 

上图最后一行说明系统调用添加成功。

 

四.使用ptrace或类似的工具对测试程序进行跟踪调试:

 1.先用strace,可以查看程序的系统调用。

   A.

 

 

 

下图中read0, 就是程序中a的输入,这里我输入19.

syscall_0x150则是测试程序中的系统调用,0x150 16进制转化为10进制即为336,是我们刚刚添加的系统调用号。

write则为printf

 

 

    B.再用strace -c 可以查看测试程序的各类系统调用。如下图。

 

 2.接下来用gdb调试。gdbptrace的基础上得来,功能强大且简便。

 

A.我们这里仅仅简单的调试。  

 

输入l可以查看程序源码。

 

 

输入r可以运行程序。

 

输入b x,可以在x行前添加断点。

 

 

加断点后先r,再用c可以一步步执行,每次到断点停止。

 

clear可以清除断点

 

return前插入断点,运行,输入bt可以查看堆栈调用。

 

 

3.Gdb和strace还有很多功能,对测试程序进行调试。在此不再演示。

 

 

题外话:

其实这就是操作系统第一次的大作业,实验报告我也差不多就这么写了。

假如有WHU的同学们参考了这篇文章。。不要copy啊 XD

教训:

1.在sudo vim arch/x86/include/asm/syscalls.h //声明    的时候world打成了wrold。。(哭泣)浪费了2个小时 

2.网上多数教程是syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);但是这是32位机的情况,若是64位,则改成syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX*8, NULL); (打开reg.h看一看)

posted @ 2019-03-02 17:17  Erio  阅读(8973)  评论(0编辑  收藏  举报