当前位置: 技术问答>linux和unix
copy_to_user 函数的问题
来源: 互联网 发布时间:2016-05-05
本文导语: unsigned long copy_to_user (void __user * to, const void * from, unsigned long n); 这个函数中的 to和from指针类型是不是得一样的 假如to的是 char *to from 是 int *from,能得到正确的结果吗 | 这个函...
unsigned long copy_to_user (void __user * to, const void * from, unsigned long n);
这个函数中的 to和from指针类型是不是得一样的
假如to的是 char *to
from 是 int *from,能得到正确的结果吗
这个函数中的 to和from指针类型是不是得一样的
假如to的是 char *to
from 是 int *from,能得到正确的结果吗
|
这个函数的使用就跟memcpy差不多,to和from只不过是个指针地址,至于用什么类型来读取这个指针跟他们无关,一概强制转换成(void *)就是了
|
任何类型的指针都能赋值给void *,所以你传递给其的指针类型没有任何影响,关键是看其内部如何实现的
其实和memcopy一样,在内部其将void *再转化为char *,然后实行拷贝,因此unsigned long n的单位默认
为sizeof(char)即字节,
下面为使用实例
copy_from_user((char *)&CanData_write, buffer, sizeof(CanData));
copy_to_user(buffer, (char *)&candata_ret, count)
其实和memcopy一样,在内部其将void *再转化为char *,然后实行拷贝,因此unsigned long n的单位默认
为sizeof(char)即字节,
下面为使用实例
copy_from_user((char *)&CanData_write, buffer, sizeof(CanData));
copy_to_user(buffer, (char *)&candata_ret, count)
|
是这样,只是要注意别把两指针所指的地址搞混了, to是user space地址,而from 是内核地址,由于user space的当前地址可能不在内存中,所以可能引起 pagging,会造成阻塞,不能在中断等地方调用。