此文叙述了增加copy系统功能调用(本次实验同时做了p,v操作的系统功能调用,但我的那个程序的原创部分太少,不便贴出)的方法,在2.4.22内核下编译通过。可以任意使用,主要有以下几个步骤:

1,在/usr/src/linux-2.4.22/kernel/sys.c的最后添加:

asmlinkage void sys_mycopy(char * infile,char * outfile)
{
 int infiled,outfiled,count;
 char buf[256];
 mm_segment_t fs; //堆栈保护
 fs=get_fs();
 set_fs(get_ds());
 infiled=sys_open(infile,O_RDONLY,0);
 if(infiled== -1)
  printk("Opening InFile Failed !\n");
 outfiled=sys_open(outfile,O_WRONLY | O_CREAT,S_IRUSR | S_IWUSR);
 if(outfiled== -1)
  printk("Open or Creat OutFile Failed !\n");

 while((count=sys_read(infiled,buf,256))>0)
  if(sys_write(outfiled,buf,count)!=count)
   printk("Writing Failed !\n");
  if(count==-1)
   printk("Reading Failed !\n");
  sys_close(infiled);
  sys_close(outfiled);
  set_fs(fs);
}

2

/usr/include/asm/unistd.h/usr/src/linux-2.4.22/include/asm-i386/unistd.h两个unistd.h文件中添加:

#define __NR_mycopy  235

注意:末尾的号是可以修改的,但最好不要超过255,若相同的号已经被使用可以将原来的替换掉(加上注释)。

 3,在/usr/src/linux-2.4.22/arch/i386/kernel/entry.s文件中添加:

.long SYMBOL_NAME(sys_mycopy)

注意:若此文件的最后一项的有关数据是根据表长而定的则不必修改,否则修改,使其值加1(因为增加了一个系统功能)。

4,依次执行:make mrproper (若是第一次编译,此命令跳过),make xconfig ( 修改File Systems表项,将其中有关ext3文件格式都选择为 Y,根据你的CPU型号修改CPU选项( 左面由上到下第三项)等等,例如有的需要修改对usb的支持,请看各项的帮助信息),make dep,make clean ,make bzImage(若此步没有错误则基本成功),make modules ,make modules_install ,make install 。

5,修改boot/grub/grub.conf中的内容,将表下相关系统(本系统为2.4.22一行末尾)的=LABL=/改为表前几行中的硬盘号(如=/dev/hda8),重新启动系统,进入刚刚编译成的内核。

6,编写测试程序:

源码:

//testcopy.c

#include<linux/unistd.h>
_syscall2(int,mycopy,char *, infile,char * ,outfile)
int errno;
int main(int argc,char * argv[])
{
 mycopy(argv[1],argv[2]);
 return 0;
}
编译:gcc testcopy.c -o testcopy

运行:./testcopy

.long SYMBOL_NAME(sys_mycopy)

注意:若此文件的最后一项的有关数据是根据表长而定的则不必修改,否则修改,使其值加1(因为增加了一个系统功能)。

4,依次执行:make mrproper (若是第一次编译,此命令跳过),make xconfig ( 修改File Systems表项,将其中有关ext3文件格式都选择为 Y,根据你的CPU型号修改CPU选项( 左面由上到下第三项)等等,例如有的需要修改对usb的支持,请看各项的帮助信息),make dep,make clean ,make bzImage(若此步没有错误则基本成功),make modules ,make modules_install ,make install 。

5,修改boot/grub/grub.conf中的内容,将表下相关系统(本系统为2.4.22一行末尾)的=LABL=/改为表前几行中的硬盘号(如=/dev/hda8),重新启动系统,进入刚刚编译成的内核。

6,编写测试程序:

源码:

//testcopy.c

#include<linux/unistd.h>
_syscall2(int,mycopy,char *, infile,char * ,outfile)
int errno;
int main(int argc,char * argv[])
{
 mycopy(argv[1],argv[2]);
 return 0;
}
编译:gcc testcopy.c -o testcopy

运行:./testcopy


3条评论

  1. 横横横横

  2. 课程设计做得怎么样了?好好搞啊,别给我丢人!呵呵 在你那拿的书不错啊,谢谢,楼主就是好人!

  3. 课程设计已经结束了,感觉还是说的过去的,至于那些书啊!小菜一碟啦!有需要尽管说阿!

发表评论

评论也有版权!