实验编号

1

题目

系统调用

实验目的

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

实验内容

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

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

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

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

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

报告内容要求

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

(2) 测试及结果

     

一、实现思路

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

 

二、实验步骤

1cd  /usr/src/linux/kernel

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

         asmlinkage int sys_mycall(int num)

{

     if(num > 0)

     {

        return 2;

}

else

{

        return 13061032;

     }

}

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

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

             .long SYMBOL_NAME(sys_mycall)

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

            cd /usr/include/asm   vi unistd.h

         添加:   #define  __NR_mycall    191

6)编译内核:

      #make mrproper   /* clean old config info */

   #make clean      /* clean old object file */

#make menuconfig /* do nothing,just exit and save config,all  use 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)测试执行,编写如下测试函数:

       #include <linux/unistd.h>
        
        
_syscall1(int,mycall,int,ret);
        
        
int main()
        
        
{
        
        
          printf("My name is oyz,and my number is %d./n",mycall(0));
        
        
          printf("The last of my number is %d./n",mycall(1));
        
        
          return 0;
        
        
}
         
         

      
      
       
        
      
      

三、测试结果

略。

 

 

 

 

 

 

Logo

更多推荐