主题 : 应用程序向驱动中传送地址指针,驱动能访问吗? 复制链接 | 浏览器收藏 | 打印
白菜的成长
级别: 新手上路
UID: 70523
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2012-05-21
最后登录: 2013-05-12
楼主  发表于: 2012-11-04 20:47

 应用程序向驱动中传送地址指针,驱动能访问吗?

RT
应用程序通过malloc申请了一段空间,往里面存了一些数据
通过ioctl把该段的起始地址传给下面的对应的驱动
驱动能访问到该段地址中存储的数据吗?

大概是涉及到虚拟地址,物理地址,模拟地址,内核空间,用户空间,有点没搞清楚?
求指点?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2012-11-05 11:42

 回 楼主(晓晓汀yy) 的帖子

通常情况下,驱动需要通过copy_from_user()获取用户空间的应用程序传入的地址上的数据。更多细节参考《Linux设备驱动》第三版(http://www.aiothome.net/read.php?tid-1859.html)的3.7节“读和写”。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
白菜的成长
级别: 新手上路
UID: 70523
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2012-05-21
最后登录: 2013-05-12
2楼  发表于: 2012-11-06 11:21

 回 1楼(kasim) 的帖子

很多地方都是这样讲要使用copy_from_user(),但我自己做了这样一个实验:
在应用程序中
tv_buff = (char*)malloc(614400);
if(tv_buff==NULL)
     goto err;
printf("tv_buff = 0x%08x\n",tv_buff);
memset(tv_buff,23,614400);
    for(i=0;i<1280;i++)
printf("tv_buff+%d = %d\n",i,*(tv_buff+i));
并且通过ioctl
ctrl_cam.id = V4L2_video;
ctrl_cam.value = tv_buff;    
if((n =(ioctl(dev_fp, VIDIOC_S_CTRL, &ctrl_cam)))<0)
把这个值传递下去,在驱动中:接收这个指针,并且打印
yy_getbuff = sp->SrcFrmSt;
for(i=0;i<1280;i++)
    printk("---yy yy_getbuff+%d= %d\n",i, *(yy_getbuff+i));

传下去的指针的地址和值都是一样的。这样可以说明传递下去的指针可以接受并访问吗?
关于write和read的方法,也正在参阅中,谢谢版主~
    
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2012-11-06 12:35

 回 2楼(晓晓汀yy) 的帖子

如果是我的话,我会用copy_from_user() :)
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."