免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2801 | 回复: 8

[硬件及驱动] proc接口在proc_write函数中循环打印用户空间传入内核空间数据buf数组机器重启 [复制链接]

论坛徽章:
0
发表于 2013-03-28 18:32 |显示全部楼层
本帖最后由 zotozo 于 2013-03-28 18:35 编辑

因为要从用户空间更新数据要往寄存器循环写入十六进制数据,采用方法:把用户空间数据拷贝到内核空间
  1. ssize_t hl_proc_write(struct file *filp, const char __user * buff,unsigned long len, void *data)
  2. {
  3.         char *p_buf = NULL,temp;
  4.         int i = 0;
  5.         p_buf = kmalloc(12*PAGE_SIZE, GFP_KERNEL);

  6.         //memset(p_buf, 0, len);
  7.         if (len)
  8.         {       
  9.                 if (!access_ok(VERIFY_READ, buff, len))  return -EFAULT;         
  10.                 if (copy_from_user(p_buf, buff, len))  return -EFAULT;
  11.                 h_write_register_byte(this_client, 0x7d, 0xad);
  12.                     h_write_register_byte(this_client, 0x3, 0);
  13.                     udelay(HL_DELAY_US_BETWEEN_IO_WRITES);               
  14.                 for(i = 0;i < len;i++)
  15.         {
  16.             //h_write_register_byte(this_client, i ? 0x4b : 0x4a, p_buf[i]);
  17.                         printk("user input : %x\n", p_buf[i]);
  18.             udelay(H_DELAY_US_BETWEEN_IO_WRITES);
  19.         }
  20.         temp = h_read_register_byte(this_client, 0x3);
  21.         if((temp & 0x60) == 0x40)
  22.             printk(KERN_INFO "download patch ok %x \n", temp);
  23.         else
  24.             printk(KERN_INFO "download patch failed %x \n", temp);
  25.                 kfree(p_buf);                   
  26.         }
复制代码
在内核中查看log,buf内容打印不完全(printk("user input : %x\n", p_buf);即这句话输出),机器就会重启。哪位大神知道什么原因buf内容大小40K

论坛徽章:
0
发表于 2013-03-28 19:07 |显示全部楼层
直接重启了?没有oops信息?接个串口把oops弄出来看看。
软件导致的直接重启一般都是直接或间接的导致double fault异常都无法处理。

你这段代码有几个问题,kmalloc没有判空。printk和udelay忙等太多而太耗时间了,是不是有什么硬件机制重启机器了?比如watchdog什么的。


论坛徽章:
0
发表于 2013-03-28 22:07 |显示全部楼层
很有可能是 kmalloc失败了。

论坛徽章:
0
发表于 2013-03-28 23:48 |显示全部楼层
                        printk("user input : %x\n", p_buf[i]);
这句话,会用整形操作访问到非4字节的对齐的地址。不出意外arm会出data abort异常的。然后就panic了。然后重启。

论坛徽章:
0
发表于 2013-03-29 09:29 |显示全部楼层
回复 2# lenky0401

printk是有信息输出的,我的传进来的buff是一个数组,数组为十六进制数,数组大小大概是a[8000],大概能输出数组到a[3000],printk打印可以看到。就会当机,然后机器就会重启。这个跟kmalloc没有判空,应该没有什么关系,消耗太多时间不至于重启吧?
   

论坛徽章:
0
发表于 2013-03-29 09:30 |显示全部楼层
回复 3# 鬼鬼一哈


    malloc失败这里就会有判断啊,if (copy_from_user(p_buf, buff, len))  return -EFAULT;

论坛徽章:
0
发表于 2013-03-29 09:34 |显示全部楼层
回复 4# blake326


    因为这句for循环循环执行h_write_register_byte(this_client, i ? 0x4b : 0x4a, p_buf);这句会引起所描述的问题,我才加了printk观察原因的,就是不加这句 printk("user input : %x\n", p_buf);也会出现问题

论坛徽章:
0
发表于 2013-03-29 09:45 |显示全部楼层
h_write_register_byte() 这个怎么实现的。
会不会是由于usr的buf没有页表映射,产生了缺页异常,刚好在你的函数里面内核进入了in_atomic状态,然后就挂了。

最好把串口打出来。

论坛徽章:
0
发表于 2013-03-29 09:47 |显示全部楼层
本帖最后由 blake326 于 2013-03-29 09:47 编辑

回复 4# blake326


    说错了,反悔一下, 。  如果 *(int*)buf  才会出我说的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP