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

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检查系统调用号,即查系统调用向量表 --> 找

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

posted @ 2013-06-06 09:35  独墅一枝花  阅读(943)  评论(1编辑  收藏  举报