Linux字符设备驱动(1)

以下代码照抄胡明庆《操作系统教程与实验》的实验8,但在VMWARE7.1上的REDHAT9用gcc-O2-D_KERNEL_-DMODULE-I/usr/src/linu... 以下代码照抄胡明庆《操作系统教程与实验》的实验8,但在VMWARE7.1上的RED HAT 9用gcc -O2 -D_KERNEL_ -DMODULE -I /usr/src/linux-2.4/include -c mydriver.c编译不通过。出现一大堆错误,见下。我把怀疑有错的地方加了注释,但改过了还是有问题,请高手支招!只要回答得好,分数继续追加!

//mydriver.c
#define_NO_VERSION_
#include "linux/module.h"
#include "linux/version.h"

char kernel_version[]=UTS_RELEASE;

#ifndef_KERNEL_
#define_KERNEL_
#endif

#include "linux/kernel.h"
#include "linux/fs.h"
#include "linux/errno.h"
#include "linux/types.h"
#include "asm-i386/uaccess.h"

#define MYDRIVER_MAJOR 0

int mydriver_major=MYDRIVER_MAJOR;

static int mydriver_open(struct inode* inode,struct file* filp)
{
MOD_INC_USE_COUNT;

return 0;
}

static int mydriver_release(struct inode* inode,struct file* filp)
{
MOD_DEC_USE_COUNT;

return 0;
}

static ssize_t mydriver_read(struct file* filp,char** buf,size_t count,loff_t* fpos)//ssize_t是不是要改为SSIZE_T?
{
int i;

if (verify_area(VERIFY_WRITE,buf,count)==-EFAULT)
{
return -EFAULT;
}

for (i=count;i>0;i--)
{
__put_user(1,buf);//put前面是两杠“__”还是一杠“_”?
buf++;
}

return count;
}

static ssize_t mydriver_write(struct file* filp,const char* buf,size_t count,loff_t* fpos)//ssize_t是不是要改为SSIZE_T?
{
return count;
}

struct file_operations mydriver_fops=
{
NULL,
NULL,
mydriver_read,
mydriver_write,
NULL,
NULL,
NULL,
NULL,
mydriver_open,
NULL,
mydriver_release,
NULL,//这里还要逗号?
};

#ifdef MODULE

int init_module()
{
MODULE_LICENSE("GPL");

int result=register_chrdev(mydriver_major,"mydriver",&mydriver_fops);

if (result<0)
{
printk(KERN_WARINING "mydriver driver: can't get major %d\n",mydriver_major);

return result;
}

if (!mydriver_major)
{
mydriver_major=result;
}
}
void cleanup_module()
{
unregister_chrdev(mydriver_major,"mydriver");
}

#endif
展开
 我来答
Isolated_BB
2011-01-07 · TA获得超过102个赞
知道答主
回答量:35
采纳率:0%
帮助的人:46.1万
展开全部
我觉得编译不成功的问题会有很多 我简单的看了下程序 首先你的头文件的形式都是
#include "linux/kernel.h"
#include "linux/fs.h"
#include "linux/errno.h"
#include "linux/types.h"
#include "asm-i386/uaccess.h"
你用的是""而不是<> 那么你的头文件是不是放在了哪里?如果是""的话 应该是放在此文件的目录下吧
我觉得你还是要把错误信息提示出来 这样单纯的看程序很难 判断你哪里出现了问题 如果错误太多的话并且大部分不是语法问题 那么你就要看看你编译指令了
gcc -O2 -D_KERNEL_ -DMODULE -I /usr/src/linux-2.4/include -c mydriver.c 这句话明显是去内核里去调用函数的include头文件 而你的头文件是""形式说明他没有从内核里调用 所以我觉得首要问题应该是出现在这里吧
至于makefile文件 我觉得那个不是必须的 只要你 编译的指令写的正确 就没有必要再去写一个makefile文件 毕竟makefile文件中 存放的也是编译指令 只不过是简化了些 实用了些
个人意见 如果还是存在大量错误 请留言
rachel456789
2011-01-07
知道答主
回答量:22
采纳率:0%
帮助的人:17.8万
展开全部
2.6 里编译驱动,不用makefile是不行的。
http://blog.csdn.net/pottichu/archive/2007/11/19/1892245.aspx
http://blog.csdn.net/pottichu/archive/2007/11/19/1892203.aspx
2.6内核中没有MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT宏
改正:
#define_NO_VERSION_ ==》#define __NO_VERSION__
#ifndef_KERNEL_ ==》#ifndef __KERNEL__
#define_KERNEL_ ==》#define __KERNEL__
注释掉MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT
写个makefile文件:

#Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
mymodule-objs := mydriver.o
obj-m := mymodule.o
else
PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif

编译命令
#make
#insmod mymodule.ko
#lsmod
可以看到加载的mymodlule模块
#rmmod mymodule
卸载mymodule模块
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式