|
本人想用内核模块的方法增加一个系统调用,具体代码示例如下:
/* pedagogictime.c */
#include <linux/kernel.h>
#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 260
MODULE_DESCRIPTION("My sys_pedagogictime()");
MODULE_AUTHOR("Your name , (c) 2002,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"id %ld called sys_gettimeofday(). \n",(long)current->pid);
MOD_DEC_USE_COUNT;
return 0;
}
int __init init_addsyscall(void)
{
extern long 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 long sys_call_table[];
sys_call_table[__NR_pedagogictime]=(unsigned long)anything_saved;
}
module_init(init_addsyscall);
module_exit(exit_addsyscall);
然后本人想把它编译成.o文件,命令如下
gcc -Wall -o2 -DMODULE -D__KERNEL__ -DLINUX -c pedagogictime.c
-o pedagogictime.o -I/usr/src/linux-2.4/include
编译完成无任何提示,好像编译成功了???
使用insmod pedagogictime.o把它动态地加载到正在运行的内核中.但是提示错误,错误代码如下:
pedagogictime.o: unresolved symbol prefetch
pedagogictime.o: unresolved symbol sys_call_table
pedagogictime.o:
Hint: You are trying to load a module without a GPL compatible license
and it has unresolved symbols. Contact the module supplier for
assistance, only they can help you.
希望各位高手赐教问题出在哪儿??如何解决??
谢先!!!
附:平台为Red Hat 9.0
测试程序test.c如下所示:
#include <linux/time.h>
#include <linux/unistd.h>
#define __NR_pedagogictme 260
_syscall(int,pedagogictime,struct timeval *,thetime)
int main()
{
struct timeval tv;
pedagogictime(&tv);
printf("tv_sec : %ld\n",tv.tv_sec);
printf("tv_usec : %ld\n",tv.tv_usec);
printf("let me sleep for 2 seconds. \n");
sleep(2);
pedagogictime(&tv);
printf("tv_sec : %ld\n",tv.tv_sec);
printf("tv_usec : %ld\n",tv.tv_usec);
} |
|