免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1409 | 回复: 3
打印 上一主题 下一主题

自己写的驱动 出现问题望指导 [复制链接]

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-04 21:33 |只看该作者 |倒序浏览
每次打开设备的时候就会死机  怎么回事啊
代码如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/fs.h>
#define TEST_FAULT   0
#define TEST_SUCCESS  1

char test_buff[100] = {0};

int test_open(struct inode *inode, struct file *filp)
{
       
        printk(KERN_NOTICE"open test chrdev\n");
        printk(KERN_NOTICE"%s\n", test_buff);
       
        return TEST_SUCCESS;
}

int test_close(struct inode *inode, struct file *filp)
{
        printk(KERN_NOTICE"close test chrdev\n");
        printk(KERN_NOTICE"%s\n", test_buff);
        return TEST_SUCCESS;
}

int test_read(struct file *filp, char *buff, int count, loff_t *offp)
{
        int len = 0;
        len = copy_to_user(buff, test_buff, 7);
        return len;
}

int test_write(struct file *filp, char *buff, int count, loff_t *offp)
{
        int len = 0;
        len = copy_from_user(yun, buff, 7);
        return len;
}

struct file_operations test_fops = {
        .owner = THIS_MODULE,
       
        .read = test_read,
        .write = test_write,
       
        .open = test_open,
        .release = test_close,
        };
static int cdev_test_init(void)
{
        dev_t num_cdev;
        int major = 789, minor = 0;
        struct cdev *test_cdev = NULL;
        num_cdev = MKDEV(major, minor);
        register_chrdev_region(num_cdev, 1, "cdev_all");
        memcpy(test_buff, "hello world haha", 16);
        test_buff[17] = '\0';
        //分配设备
       
        test_cdev = cdev_alloc();
        if(NULL == test_cdev)
        {
                printk(KERN_NOTICE"cdev alloc fault\n");
                return TEST_FAULT;
        }
        cdev_init(test_cdev,&test_fops);
        test_cdev->owner = THIS_MODULE;
        test_cdev->ops = &test_fops;
        //注册设备
        if(cdev_add(test_cdev, num_cdev, 1))
        {
                printk(KERN_NOTICE"cdev add fualt\n");
                return TEST_FAULT;
        }


        return TEST_SUCCESS;
}

static int cdev_test_exit(void)
{
        printk(KERN_NOTICE"%s",test_buff);
        return TEST_SUCCESS;
}

module_init(cdev_test_init);
module_exit(cdev_test_exit);
MODULE_LICENSE("GPL");
运行出错消息:


未命名.jpg (87.49 KB, 下载次数: 8)

出错消息截图

出错消息截图

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
2 [报告]
发表于 2013-05-04 21:35 |只看该作者
回复 1# tc1989tc


    在用kgdb调试的时候,,,好像提示的是在内核调用chr_open系统函数的时候 报的段错误。。。。但是我看不来是什么问题

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
3 [报告]
发表于 2013-05-04 22:23 |只看该作者
我对驱动程序只了解一点点,对于你的程序,我只能说一下几处疑惑,希望对你有帮助。
1.驱动程序不能调用memcpy在用户空间和内核空间之间拷贝,而应该用copy_from_user和copy_to_user代替。而你的程序在init方法中调用了,难道在init方法中可以?
2.一般系统调用返回0表示成功,而你将SUCCESS定义为1,FAULT定义为0,是否表示初始化失败了?
3.既然调用了cdev_alloc,为什么又调用cdev_init?

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
4 [报告]
发表于 2013-05-04 23:03 |只看该作者
回复 3# 井蛙夏虫

谢谢哥们   在init初始化中用memcpy不是从用户空间复制到内核空间 所以可以这么用
问题就是出在你说的返回值是0和1 的那点   
但是还是  还是没搞懂  返回相反的值  会造成内核段错误  真心伤不起啊  
希望还有懂的朋友继续指导哈  
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP