给linux添加系统调用

实验编号

1

题目

系统调用

实验目的

加深对系统函数库、操作系统提供的系统调用的共同点和差异的认识,通过认识、了解Linux系统调用的实现方式,强化操作系统为用户提供接口方式的理性认识。

实验内容

为Linux内核增加一个系统调用,并编写用户进程的程序来测试。

要求该系统调用能够完成以下功能:

1. 该系统调用有1个整型参数。

2. 若参数大于0,则返回自己学号的最后一位。如您的学号为248,则返回8。

3. 若参数小于或等于0,则返回自己的学号。如您的学号为248,则返回248。

报告内容要求

(1) 程序实现方法和思路

(2) 测试及结果

报告正文

一、实现思路

给linux添加一个系统调用,也就是为linux增加一个api函数。这样需要修改linux的内核,然后通过编译就会形成一个新内核,在新内核里即可调用自己添加的api函数。



二、实验步骤

(1)cd/usr/src/linux/kernel

(2)vi sys.c 并添加如下一个函数:

asmlinkage int sys_mycall(int num)

{

if(num > 0)

{

return 2;

}

else

{

return 13061032;

}

}

(3)cd /usr/src/linux/arch/i386/kernel

(4)vi entry.S并添加如下代码

.long SYMBOL_NAME(sys_mycall)

(5)在头文件中增加申明:

cd /usr/include/asmvi unistd.h

添加:#define__NR_mycall191

(6)编译内核:

#make mrproper/* clean old config info */
#make clean/* clean old object file */

#make menuconfig /* do nothing,just exit and save config,alluse default */

#make dep/* binding the configuration info */

#make bzImage/* it should work. */

(7)编译完成后,将新内核文件和新的系统符号表拷贝到/boot目录,如下:

#cp arch/i386/boot/bzimage/boot/bzimage_00

#mkinitrd /boot/bzImage_00.img 2.2.14-15mdk

(8)修改系统配置文件(/etc/lilo.conf):

在lilo.conf文件末尾添加如下代码:

image = /boot/bzImage_00

label = linux-oyz

root = /dev/sda5

initrd = /boot/bzImage_00.img

append = “”

read-only

(9)使用超级用户运行:/sbin/lilo,然后重新启动:reboot

(10)在启动的boot页面,Tab选择linux-oyz启动。

(11)测试执行,编写如下测试函数:



















三、测试结果


略。














【给linux添加系统调用】

    推荐阅读