加载驱动出错!!!!

发布于 2022-07-22 21:31:55 字数 7810 浏览 19 评论 2

我写了一个测试使用的字符驱动如下:
###################################################hello.c
#include <linux/version.h>
#include <linux/config.h>

#if CONFIG_MODVERSIONS == 1
#define MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/wait.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/ioctl.h>
#include "hello.h"

struct  file_operations   hello_fops =
{
        .owner           = THIS_MODULE,
        .llseek             = hello_llseek,
        .open            = hello_open,
        .release         = hello_release,
};

loff_t hello_llseek(struct file * filp, loff_t off, int whence)
{
        return 0 ;
}

/*Open方法*/
int  hello_open(struct inode *inode, struct  file  *filp)
{
        printk("hello: open  /dev/hello!!!n") ;
        try_module_get(THIS_MODULE) ;
        return 0 ;       
}

/*Release 方法*/
int  hello_release(struct inode *inode, struct  file  *filp)
{
        printk("hello: close /dev/hello!!!n") ;
        module_put(THIS_MODULE) ;
        return 0 ;       
}

static  int  __init  my_init_function(void)
{
        int       result, err ;
        /*注册驱动设备主,次设备号*/
        if(hello_major)
        {
                /*指定主设备号*/
                hello_dev = MKDEV(hello_major,  hello_minor) ;
                result =  register_chrdev_region(hello_dev,  1,  "Hello") ;
        }
        else
        {
                /*动态分配主设备号*/
                result = alloc_chrdev_region(&hello_dev, hello_minor, 1, "Hello") ;
                hello_major = MAJOR(hello_dev) ;
        }
        if(result < 0)
        {
                printk(KERN_ERR "hello: can't  get  major %dn", hello_major) ;
                return -1 ;
        }
       
        /*注册字符设备驱动程序*/
        phello_cdev = cdev_alloc() ;
        if(phello_cdev != NULL)
        {
                cdev_init(phello_cdev,  &hello_fops) ;
                phello_cdev->ops = &hello_fops ;
                phello_cdev->owner = THIS_MODULE ;
                err = cdev_add(phello_cdev,  hello_dev,  1) ;
                if(err)
                {
                        printk(KERN_NOTICE "Error %d adding hello_cdev", err);       
                }
                else
                {
                        printk("Success adding hello_cdev!n") ;
                }
        }
        else
        {
                printk(KERN_ERR "hello: Register char hello_dev errorn") ;
                return -1 ;
        }
        return  0 ;
}

static  void  __exit   my_cleanup_function(void)
{
        unregister_chrdev_region(hello_dev,  1) ;
}

module_init(my_init_function) ;
module_exit(my_cleanup_function) ;

MODULE_AUTHOR("CHENHUI") ;
MODULE_DESCRIPTION("Test") ;
MODULE_LICENSE("GPL") ;

###########################################################hello.h
#ifndef   _HELLO_H_
#define   _HELLO_H_

#define MYDRIVER_NAME "Hello"
#undef MYDRIVER_MAJOR
#ifndef MYDRIVER_MAJOR
#define MYDRIVER_MAJOR 0   /* dynamic major by default */
#endif

loff_t   hello_llseek (struct file *filp, loff_t off, int whence);
int       hello_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
int       hello_open(struct inode *inode, struct file *filp);
int       hello_release(struct inode *inode, struct file *filp);

extern struct file_operations hello_fops;

struct  cdev   *phello_cdev ;               //字符设备的节点
dev_t   hello_dev ;                              //驱动设备号的节点

/*给主,次设备号赋值*/
int  hello_major  =  MYDRIVER_MAJOR;
int  hello_minor = 0 ;
#endif

*******************************************************************************
我的问题如下:
1.我编译的时候使用的是make -C /usr/src/linux SUBDIRS=$PWD modules,第一次运行这个命令的时候,为什么会编译内核?我按照《linux 设备驱动 第三版》上的写法make -C /usr/src/linux M ='pwd' modules  结果只会编译内核,我的目录下根本没有任何新的文件(*.ko  *.mod.o等等)生成?
2.当我使用make -C /usr/src/linux SUBDIRS=$PWD modules编译成功后,运行#insmod hello.ko后,我使用dmesg看到系统提示:“no version for"struct_module" found:kernel tainted”,请问这是怎么回事?
3.最后一个让我很郁闷的问题:第一次运行#insmod hello.ko后,察看/proc/devices里面还是有我的设备的,设备号是252,然后我运行:#rmmod hello.ko.然后再次运行:#insmod hello.ko,结果系统就抱错了:我对照代码。是我的cdev_add函数出错了,错误号是-17,请问怎么解决?

谢谢大家!请大家指点一下。十分感激!!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雅心素梦 2022-07-23 03:25:57

google

一向肩并 2022-07-23 03:02:59

google
你的问题太常见, 怎不自己找一下答案

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文