LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 951|回复: 5

增加系统调用新问题(急!!!)

[复制链接]
发表于 2003-5-31 08:39:32 | 显示全部楼层 |阅读模式
本人想用内核模块的方法增加一个系统调用,具体代码示例如下:
/* 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);
}
 楼主| 发表于 2003-5-31 08:52:52 | 显示全部楼层
如果使用命令:gcc -Wall -O2 -DMODULE -D__KERNEL__ -DLINUX -c pedagogictime.c -O pedagogictime.o -I/usr/src/linux-2.4/include
则错误信息如下所示:gcc: pedagogictime.o: linker input file unused because linking not done
发表于 2003-5-31 10:43:08 | 显示全部楼层

据说,2.4内核的版本sys_call_table变量不能被引出

我也试过,跟你一样的结果
应该用-O2 ...-o 文件名.o ....(我认为)
发表于 2003-5-31 11:16:25 | 显示全部楼层
发表于 2003-5-31 19:56:31 | 显示全部楼层

跟楼主的差不多

好像行不通,我基本上就是那样做的
发表于 2003-5-31 19:57:18 | 显示全部楼层

跟楼主的差不多

好像行不通,我基本上就是那样做的,在9.0下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表