LinuxSir.cn,穿越时空的Linuxsir!

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

2.4核心下的内核模块系统调用编译问题!

[复制链接]
发表于 2005-5-16 14:46:34 | 显示全部楼层 |阅读模式
很简单的一个模块,要在模块初始化的时候实现一个空的read()系统调用,可编译总出错
程序如下:
#define __KERNEL_SYSCALLS__
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/file.h>
#include <linux/unistd.h>
#include <linux/slab.h>

#include</usr/src/linux-2.4.20-8/include/linux/vmalloc.h>

#include <asm-i386/uaccess.h>
#include <asm-i386/msr.h>
#include <asm/fcntl.h>
#include <asm/errno.h>
#include "read.h"

MODULE_LICENSE("GPL");

void ksys_print(char *name, unsigned long value)
{
  printk("ksystime: %3li -- %s\n", value, name);
}

int errno;

static int __init read_init(void)
{
       printk("hello,this is my own items\n");
       mm_segment_t fs;
       unsigned long ini, end, now, best, tsc;
       int i;
       char buffer[4];

       #define measure_time(code) \
               for (i = 0; i < NTRIALS; i++) { \
               rdtscl(ini); \
               code; \
               rdtscl(end); \
               now = end - ini; \
               if (now < best) best = now; \
               }

       /* time rdtsc (i.e. no code) */
       best = ~0;
       measure_time({});
       tsc = best;
       ksys_print("tsc", tsc);

       /* time an empty read() */
       fs=get_fs();
       set_fs(get_ds());
       best =~0;
       measure_time( read(0, buffer, 0) );
       set_fs(fs);

       /* report data */
       ksys_print("read()", best - tsc);

       return 0;
}

static void __exit read_cleanup(void)
{
}

module_init(read_init);
module_exit(read_cleanup);


编译时提示current为定义,已经包含了sched.h,请问还要包含什么呢?或者小弟哪里用错了?
发表于 2005-5-16 15:54:46 | 显示全部楼层
是不是编译的时候没有加 -I/usr/src/linux-2.4.20-8/include?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-16 16:16:10 | 显示全部楼层
恐怕不是这个问题,刚才测试了一下,问题依旧
在include了current.h后,current未定义错误没有了
但是其他错误依然很多,

而且,如果把主要代码屏蔽,发现错误没有减少

也就是说,只包含头文件时编译也有差不多的错误,init和exit根本没做什么事情
唉,我都绿了
回复 支持 反对

使用道具 举报

发表于 2005-5-16 19:50:56 | 显示全部楼层
最好把错误帖出来

还有,有没有define MODULE __KERNEL__ LINUX
用的是 2.6 还是 2.4 的编译方式?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-16 20:27:59 | 显示全部楼层
谢谢关心

编译代码太长,我在csdn贴了
请参看:
http://community.csdn.net/Expert ... 9.xml?temp=.8787195
回复 支持 反对

使用道具 举报

发表于 2005-5-16 21:27:03 | 显示全部楼层
把头文件路径换过后的错误信息也帖一遍吧
因为在csdn上只看到除了那个current错误外,都是头文件问题.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-16 23:00:35 | 显示全部楼层
谢谢先
请原谅环境在机房的机器上,明天才能贴修改后的调试信息
在加了current.h后,current错误不出现了
在注释掉init中操作部分后,头文件中依然显示大量的错误
我怀疑大部分都是头文件的错误,但是不清楚怎么解决,可否指明解决方向?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-17 16:03:47 | 显示全部楼层
问题解决
gcc -c -O2 -I/usr/src/linux-2.4.20-8/include -D MODULE -D__KERNEL__ -DLINUX  read_modify.c
回复 支持 反对

使用道具 举报

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

本版积分规则

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