• 操作系统项目:向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看一看)

  • 相关阅读:
    人工智能数学基础笔记(上)
    人工智能简介
    十三,十四 基金收益,税收与基金国际化
    资产配置模型之-BL模型
    十二 基金估值,费用与会计核算
    十一 基金的投资交易与结算
    十 基金业绩评价
    九 投资风险管理
    浙工商oj ___飞龙的飞行方程
    hd1004解题思路
  • 原文地址:https://www.cnblogs.com/lqerio/p/10461937.html
Copyright © 2020-2023  润新知