LinuxÒÁµéÔ°ÂÛ̳'s Archiver

yixiaotian ·¢±íÓÚ 2006-4-1 23:51

¡¾ÇóÖú¡¿Ä£¿éÎÞ·¨¼ÓÔØ£¬¸ßÊÖ°ïæ£¡£¡£¡

¡¶±ßѧ±ß¸É-linuxÄÚºËÖ¸µ¼¡µ¡µÖеÚÎåÕÂϵͳµ÷ÓõÄ×îºóÒ»¸öÀý×Ó£¬
/*
*pedagogictime.c
*/
//#define MODULE
#include<linux/kernel.h> /* printk() */
#include<linux/module.h>
#include<linux/init.h>

#include<linux/unistd.h>
#include<linux/time.h>

#include<asm/uaccess.h>
#include<linux/sched.h>


#define  __NR_pedagogictime   259

MODULE_DESCRIPTION("My sys_pedagogictime()");
MODULE_LICENSE("GPL");

MODULE_AUTHOR ("Your Name:),(C)2006,GPLv2 or later");

static int (*anything_saved)(void);

static int sys_pedagogictime(struct timeval *tv)
{
  struct timeval ktv;
  
  MOD_INC_USE_COUNT;

  do_gettimeofday(&ktv);
  if(copy_to_user(tv,&ktv,sizeof(ktv)))
  {
     MOD_DEC_USE_COUNT;
     return -EFAULT;
  }
  printk(KERN_ALERT "Pid %ld called sys_gettimeofday().\n",(long)current->pid);

  MOD_DEC_USE_COUNT;
  return 0;
   
}


int  __init init_addsyscall(void)
{
   extern unsigned long  sys_call_table[];
  // extern void *sys_call_table;
   anything_saved=(int(*)(void))(sys_call_table[__NR_pedagogictime]);
   
   sys_call_table[__NR_pedagogictime]=(unsigned long)sys_pedagogictime;

   return 0;
  
}

void  __exit exit_addsyscall(void)
{
   extern unsigned long sys_call_table[];
  // extern void *sys_call_table;
  
   sys_call_table[__NR_pedagogictime]=(unsigned long)anything_saved;

   
}
module_init( init_addsyscall);
module_exit( exit_addsyscall);


±àÒëÖ®ºóÄ£¿é¼ÓÔØÊ±×ܱ¨´í£º£º£ºunresolved symbol  sys_call_table
²»ÖªµÀÈçºÎÐ޸IJÅÄܵ÷ÓüÓÔØ×ŸöÄ£¿é£¬Çë¸ßÊÖÖ¸µã£¬Ð»Ð»£¡

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.