实验三:给系统添加一个新的系统调用
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检查系统调用号,即查系统调用向量表 --> 找
到对应的系统调用处理函数执行 --> 返回