• 实验三:给系统添加一个新的系统调用


    SA*****160     *丰  

    实验内容:

    1.下载新版内核源码3.9.x编译,然后用它给您的Linux系统进行内核升级。参考 http://blog.csdn.net/instruction_number21/article/details/7922783

    2. 添加新的系统调用,要求在系统调用内核处理函数中输出(如用printk)您的学号。

        http://blog.techveda.org/index.php/adding-system-calls-linux-kernel-3-5-x/

    实验检查方式:

    实验课现场检查Demo + Q&A,Demo方式:

    1.显示当前系统内核版本(如用uname);

    2.执行用户程序调用新添加的系统调用;

    3.查看新系统调用的输出信息(如用dmesg)。

    实验过程:

    1.升级内核

    a.显示原来的Ubuntu版本和Linux内核版本

    root权限下在终端输入:lsb_release -a,显示当前Ubuntu版本

    root权限下输入:uname -r,显示当前Linux内核版本

    b.下载最新的Linux稳定版内核,即linux-3.9.4.tar.xz

       将其拷贝到/usr/src目录下

       解压:xz -d linux-3.9.4.tar.xz   得到      linux-3.9.4.tar

               tar xvf   linux-3.9.4.tar    得到      文件夹 linux-3.9.4

    c.进入文件夹/usr/src/linux-3.9.4,输入命令make mrproper

    d.此步骤要使用makemenuconfig,但是前提条件是要先装ncurses

     ncurses 到http://ftp.gnu.org/pub/gnu/ncurses/下载,可以放到任何目录进行安装:

     tar zxvf  ncurses<version>.tar.gz  #解压缩并且释放文件包,之后安装即可。

    执行makemenuconfig,截图如下:

     e.make dep

        make clean

    d.输入命令make bzImage,生成新内核

     e.生成modules

      make modules

    f.安装modules

     make modules_install

    g.安装内核

     make install

    h.配置grub引导程序

     如果文件里边有,就不用修改了

    i.重启系统reboot

    j.查看是否是新内核

     uname -a

     截图如下所示:

    2.添加新的系统调用

    a.添加新的系统调用处理函数

    在刚刚linux-3.9.4中通过find -name sys.c可以找到sys.c的位置,在里面添加新的系统处理函数。通过查找可以

    看到在kernel中有用来添加新的系统调用函数的sys.c文件。

     打开sys.c文件,随便找个位置添加如下函数:

    /*
     * new syscall added by wufeng
     */
    asmlinkage int sys_lsproc(int num)
    {
        printk("SA12226160 wufeng");
        return num;
    }

     b.定义完了函数不要忘了做声明。系统调用的函数声明通常在syscalls.h中,查找它

    随便找个地方添进去

    c.添加系统调用号

    d.在添加完新的系统调用后必须要重新编译内核

    make  bzImage

    安装内核

    make install

    重启系统

    reboot

    e.测试新添加的系统调用 

    #include <unistd.h>
    #include <stdio.h>
    #define MYCALL    351
    int main()
    {
        syscall(MYCALL,1);
        return 1;
    }

    测试结果如下:

     

    实验总结:

    系统调用的执行过程:执行函数syscall(351) --> 函数syscall()的实现里边有0x80中断 --> 中断处理总程序(内核态) --> 保护现场,0x80中断

                                  处理子程序 --> 寄存器ax将系统调用好351传给systemcall --> systemcall检查系统调用号,即查系统调用向量表 --> 找

                                  到对应的系统调用处理函数执行 --> 返回

  • 相关阅读:
    列表:一个打了激素的数组3
    列表:一个打了激素的数组2
    列表:一个打了激素的数组
    了不起的分支和循环03
    了不起的分支和循环02
    了不起的分支和循环01
    飞机大战游戏
    查找算法
    Pyhon之常用操作符
    将webkit内核封装为duilib的浏览器控件
  • 原文地址:https://www.cnblogs.com/wufengv5/p/3120473.html
Copyright © 2020-2023  润新知