LinuxSir.cn,穿越时空的Linuxsir!

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

有人用过<边干边学-linux内核指导>这本书吗?问一下系统调用那一章的

[复制链接]
发表于 2005-9-5 22:03:14 | 显示全部楼层 |阅读模式
如题:
我在/kernel/ksyms.c中加入了EXPORT_SYMBOL(sys_call_table)这一项了,模块编译成功,但是在加载内核时,说unresolved symbol sys_call_table.不知道怎么办了,我的内核版本是2.4.21
源程序如下:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <errno.h>

#include <linux/unistd.h>
#include <linux/time.h>//for struct time
#include <asm/uaccess.h>//for copy_to_user()
#include <linux/sched.h>
#include <asm/current.h>//for macro current


#define __NR_pedagogictime 272

MODULE_DESCRIPTION("My sys_pedagogictime()");
MODULE_AUTHOR("smartdog ,(c)2002,GPLv2 or later");

static int (*anything_saved)(void);//用来保存旧系统调用的地址

/*这个是我们自己的系统调用函数sys_pedagogictime().*/
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("<0>Here called sys_gettimeofday().\n");
  MOD_DEC_USE_COUNT;
  return 0;
}

/*这里是初始化函数,__init标志表明这个函数使用后就可以丢弃了*/
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;
}

/*__exit标志表明模块被编译进内核,只要内核还在运行,就不会被卸载*/
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);
发表于 2005-9-6 09:17:58 | 显示全部楼层
1. 2.4 的内核应该是导出sys_call_table的,至少2.4.20是这样
2. 就算没有导出sys_call_table,你修改了内核以后,要重新编译内核才行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-6 09:24:58 | 显示全部楼层
Post by rickxbx
1. 2.4 的内核应该是导出sys_call_table的,至少2.4.20是这样
2. 就算没有导出sys_call_table,你修改了内核以后,要重新编译内核才行

嗯,我查看过/proc/ksyms这个文件,里面没有sys_call_table这个符号,内核我也试过了重新编译。make mrproper ,make menuconfig,make dep,make clean,make modules,make modules_install,不知道是不是缺了什么步骤。。。
回复 支持 反对

使用道具 举报

发表于 2005-9-6 09:33:26 | 显示全部楼层
似乎没什么问题了啊 @_@
总不至于没有将bzImage文件拷到/boot 目录,没有改grub.conf,或者没有重启系统吧??
实在不清楚会出什么问题了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-6 10:18:16 | 显示全部楼层
Post by rickxbx
似乎没什么问题了啊 @_@
总不至于没有将bzImage文件拷到/boot 目录,没有改grub.conf,或者没有重启系统吧??
实在不清楚会出什么问题了

嘿嘿,我没有把bzImage拷到/boot目录下面,我试试看
回复 支持 反对

使用道具 举报

发表于 2005-9-6 10:19:08 | 显示全部楼层
2.6的内核不到处符号表了,那本书是对2.4而言,用它的加载模块的方法增加系统调用不行。只有编译到内核里才好。另外用加载模块的方法也不是不行,不过没有那么简单
回复 支持 反对

使用道具 举报

发表于 2006-7-1 17:40:59 | 显示全部楼层
Post by smartdog
如题:
我在/kernel/ksyms.c中加入了EXPORT_SYMBOL(sys_call_table)这一项了,模块编译成功,但是在加载内核时,说unresolved symbol sys_call_table.不知道怎么办了,我的内核版本是2.4.21
源程序如下:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <errno.h>

#include <linux/unistd.h>
#include <linux/time.h>//for struct time
#include <asm/uaccess.h>//for copy_to_user()
#include <linux/sched.h>
#include <asm/current.h>//for macro current


#define __NR_pedagogictime 272

MODULE_DESCRIPTION("My sys_pedagogictime()");
MODULE_AUTHOR("smartdog ,(c)2002,GPLv2 or later");

static int (*anything_saved)(void);//用来保存旧系统调用的地址

/*这个是我们自己的系统调用函数sys_pedagogictime().*/
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("<0>Here called sys_gettimeofday().\n");
  MOD_DEC_USE_COUNT;
  return 0;
}

/*这里是初始化函数,__init标志表明这个函数使用后就可以丢弃了*/
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;
}

/*__exit标志表明模块被编译进内核,只要内核还在运行,就不会被卸载*/
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);


这种方法根本没有通用行!
看看《Linux1.0核心游记》中动态添加系统调用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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