5288|6

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

菜鸟问题:隐式声明函数 copy_to_user。大家帮忙啊 [复制链接]

#include
#include
#include        /* everything... */

#define DEVICE_NAME                "demo"
#define demo_MAJOR 249
#define demo_MINOR 0
#define MAX_BUF_LEN 20
static char drv_buf[20];


static int demo_open(struct inode *inode, struct file *file)        {
        //MOD_INC_USE_COUNT;
        sprintf(drv_buf,"device open sucess!\n");
        printk("device open sucess!\n");
        return 0;
}
static int  demo_release(struct inode *inode, struct file *filp)        {
        //MOD_DEC_USE_COUNT;
        printk("device release\n");
        return 0;
}


static ssize_t  demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)        {
        if(count > MAX_BUF_LEN)
                count=MAX_BUF_LEN;
        copy_to_user(buffer, drv_buf,count);
        printk("user read data from driver\n");
        return count;
}
static ssize_t  demo_write(struct file *filp,const char *buffer, size_t count)        {
        copy_from_user(drv_buf , buffer, count);
        printk("user write data to driver\n");
        //your code here
        return count;
}
static struct file_operations demo_fops = {
        write:        demo_write,       
        read:        demo_read,       
        open:        demo_open,
        release:        demo_release,
};

static int __init demo_init(void)        {
    int result;
    SET_MODULE_OWNER(&demo_fops);
    result = register_chrdev(demo_MAJOR, "demo", &demo_fops);
    if (result < 0) return result;
        printk(DEVICE_NAME " initialized\n");
        return 0;
}
static void __exit  demo_exit(void)        {
    unregister_chrdev(demo_MAJOR, "demo");
        printk(DEVICE_NAME " unloaded\n");
}
module_init(demo_init);
module_exit(demo_exit);


makefile

obj-m := demo.o
#KERNEL_DIR :=/lib/modules/$(shell uname -r)/build
KERNEL_DIR :=/lib/modules/2.6.18-1.2798.fc6/build
PWD := $(shell pwd)
default:
        $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

最新回复

使用copy_to_user()和copy_from_user()需包含头文件  详情 回复 发表于 2010-3-20 14:49
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
加了一段代码:

#include
#include
#include        /* everything... */

#define DEVICE_NAME                "demo"
#define demo_MAJOR 249
#define demo_MINOR 0
#define MAX_BUF_LEN 20
static char drv_buf[20];

unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
{
        if (access_ok(VERIFY_WRITE, to, n))
                n = __copy_to_user(to, from, n);
        return n;
}

unsigned long   copy_from_user(void *to, const void __user *from, unsigned long n)
{
        if (access_ok(VERIFY_READ, from, n))
                n = __copy_from_user(to, from, n);
        else
                memset(to, 0, n);
        return n;
}

static int demo_open(struct inode *inode, struct file *file)        {
        //MOD_INC_USE_COUNT;
        sprintf(drv_buf,"device open sucess!\n");
        printk("device open sucess!\n");
        return 0;
}
static int  demo_release(struct inode *inode, struct file *filp)        {
        //MOD_DEC_USE_COUNT;
        printk("device release\n");
        return 0;
}


static ssize_t  demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)        {
        if(count > MAX_BUF_LEN)
                count=MAX_BUF_LEN;
        copy_to_user(buffer, drv_buf,count);
        printk("user read data from driver\n");
        return count;
}
static ssize_t  demo_write(struct file *filp,const char *buffer, size_t count)        {
        copy_from_user(drv_buf , buffer, count);
        printk("user write data to driver\n");
        //your code here
        return count;
}
static struct file_operations demo_fops = {
        write:        demo_write,       
        read:        demo_read,       
        open:        demo_open,
        release:        demo_release,
};

static int __init demo_init(void)        {
    int result;
    SET_MODULE_OWNER(&demo_fops);
    result = register_chrdev(demo_MAJOR, "demo", &demo_fops);
    if (result < 0) return result;
        printk(DEVICE_NAME " initialized\n");
        return 0;
}
static void __exit  demo_exit(void)        {
    unregister_chrdev(demo_MAJOR, "demo");
        printk(DEVICE_NAME " unloaded\n");
}
module_init(demo_init);
module_exit(demo_exit);



make 还是过不去

[root@localhost ~]# cd /home/cc/demo
bash: cd: /home/cc/demo: 没有那个文件或目录
[root@localhost ~]# cd /home/cc/code/demo
[root@localhost demo]# ls
demo.c  demo.c~  Makefile  Makefile~  test_demo.c  test_demo.c~
[root@localhost demo]# make
make -C /lib/modules/2.6.18-1.2798.fc6/build M=/home/cc/code/demo modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-1.2798.fc6-i586'
  CC [M]  /home/cc/code/demo/demo.o
/home/cc/code/demo/demo.c: 在函数 ‘copy_to_user’ 中:
/home/cc/code/demo/demo.c:13: 错误:隐式声明函数‘access_ok’
/home/cc/code/demo/demo.c:13: 错误:‘VERIFY_WRITE’ 未声明 (在此函数内第一次使用)
/home/cc/code/demo/demo.c:13: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
/home/cc/code/demo/demo.c:13: 错误:所在的函数内只报告一次。)
/home/cc/code/demo/demo.c:14: 错误:隐式声明函数 ‘__copy_to_user’
/home/cc/code/demo/demo.c: 在函数 ‘copy_from_user’ 中:
/home/cc/code/demo/demo.c:20: 错误:‘VERIFY_READ’ 未声明 (在此函数内第一次使用)
/home/cc/code/demo/demo.c:21: 错误:隐式声明函数 ‘__copy_from_user’
/home/cc/code/demo/demo.c: 在顶层:
/home/cc/code/demo/demo.c:54: 警告:从不兼容的指针类型初始化
/home/cc/code/demo/demo.c: 在函数 ‘demo_init’ 中:
/home/cc/code/demo/demo.c:62: 错误:隐式声明函数 ‘SET_MODULE_OWNER’
make[2]: *** [/home/cc/code/demo/demo.o] 错误 1
make[1]: *** [_module_/home/cc/code/demo] 错误 2
make[1]: Leaving directory `/usr/src/kernels/2.6.18-1.2798.fc6-i586'
make: *** [default] 错误 2
[root@localhost demo]#


 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不必在代码中实现 copy_to_user 和 copy_from_user,系统核心已经实现了。如果需要这个,只需要包含

[code]
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
copy_from_user()和copy_to_user()函数的作用:由于内核空间与用户空间的内存不能直接互访,因此借助
函数copy_to_user()完成用户空间到内核空间的复制,函数copy_from_user()完成内核空间到用户空间的复制。

  1. //源码:linux/arch/i386/lib/usercopy.c

  2. copy_to_user: - Copy a block of data into user space.
  3. @to:   Destination address, in user space.
  4. @from: Source address, in kernel space.
  5. @n:    Number of bytes to copy.
  6. 849unsigned long    copy_to_user(void __user *to, const void *from, unsigned long n)

  7. 850{

  8. 851        if (access_ok(VERIFY_WRITE, to, n))
  9. 852                n = __copy_to_user(to, from, n);
  10. 853        return n;
  11. 854}

  12. copy_from_user: - Copy a block of data from user space.
  13. @to:   Destination address, in kernel space.
  14. @from: Source address, in user space.
  15. @n:    Number of bytes to copy.

  16. 874unsigned long   copy_from_user(void *to, const void __user *from, unsigned long n)
  17. 875{
  18. 876        if (access_ok(VERIFY_READ, from, n))
  19. 877                n = __copy_from_user(to, from, n);
  20. 878        else
  21. 879                memset(to, 0, n);
  22. 880        return n;
  23. 881}
复制代码
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
哥们,我还是不知道错在哪儿?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
你要问什么?

你就贴了一个

  1. 菜鸟问题:隐式声明函数 copy_to_user。大家帮忙啊
复制代码


加一段代码啦....
 
 
 

回复

1

帖子

0

TA的资源

禁止发言

7
 
使用copy_to_user()和copy_from_user()需包含头文件
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表