当前位置: 技术问答>linux和unix
ioctl中copy_from_user导致系统crash
来源: 互联网 发布时间:2017-03-31
本文导语: 我在写一个驱动遇到这样的问题: ioctl() { .... switch(cmd) { ..... case DRV_VLAN_INIT_VLANTABLE_RAM_DATA: { vlanTable_t vlanT; if (copy_from_user(&vlanT,(void*)param1,sizeof...
我在写一个驱动遇到这样的问题:
ioctl()
{
....
switch(cmd)
{
.....
case DRV_VLAN_INIT_VLANTABLE_RAM_DATA:
{
vlanTable_t vlanT;
if (copy_from_user(&vlanT,(void*)param1,sizeof(vlanT)))
{
_ioctl_dbg(dev, "DRV_VLAN_INIT_VLANTABLE_RAM_DATA copy_from_user param1");
status = -EFAULT;
}
....
}
break;
....
}
}
在这里,我的vlanT结构大小为0x97c时,系统运行正常。但是修改vlanT的结构后,大小为0xb10时,运行到copy_from_user时就会系统崩溃。
我也尝试过使用指针申请内存 vlan = kmalloc(sizeof(vlanT), GFP_KERNEL/GFP_ATOMIC),但还是会系统崩溃。
按道理来说我的系统内存足够大的,不可能说多用几K就导致系统崩溃。
请高手指点!!!!!!!
ioctl()
{
....
switch(cmd)
{
.....
case DRV_VLAN_INIT_VLANTABLE_RAM_DATA:
{
vlanTable_t vlanT;
if (copy_from_user(&vlanT,(void*)param1,sizeof(vlanT)))
{
_ioctl_dbg(dev, "DRV_VLAN_INIT_VLANTABLE_RAM_DATA copy_from_user param1");
status = -EFAULT;
}
....
}
break;
....
}
}
在这里,我的vlanT结构大小为0x97c时,系统运行正常。但是修改vlanT的结构后,大小为0xb10时,运行到copy_from_user时就会系统崩溃。
我也尝试过使用指针申请内存 vlan = kmalloc(sizeof(vlanT), GFP_KERNEL/GFP_ATOMIC),但还是会系统崩溃。
按道理来说我的系统内存足够大的,不可能说多用几K就导致系统崩溃。
请高手指点!!!!!!!
|
内核栈大小就2 pages,用0xb10这么大很可能导致crash.
至于用kmalloc时为何崩溃最好是有出错信息。。
至于用kmalloc时为何崩溃最好是有出错信息。。
|
我用copy_from_user拷贝几十K没问题。
建议你先定义个全局变量或者用kmalloc分配,应该没问题的
建议你先定义个全局变量或者用kmalloc分配,应该没问题的
|
总觉的在驱动的read,write,ioctl里面进行大的内存申请会有问题。所以我看到的一些别人的驱动都不是这么做的。都是在probe的时候,定义个结构体,申请个足够大的内存,和其中有指针和设备有关系。这样你在read。write,ioctl的时候,都可以通过文件标识符得到设备,设备通过和结构体的关系得到结构体指针,从而得到申请的内存指针,你就可以使用已经申请好的内存,而不是在read里面定义个大数组。
|
你查下内核空间和用户空间的结构体定义,是不是一致的?不一致就会系统panic.
|
关注lz的情况,把内存地址等都打印一下,排除地址问题先
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。