免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2313 | 回复: 8
打印 上一主题 下一主题

ioctl的实现问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-06 19:48 |只看该作者 |倒序浏览
这是驱动中的ioctl函数,当系统以调用这个函数时,就立刻卡住了 然后键盘上数字键盘的指示灯灭掉,另外两个指示灯不停的闪,不知道是怎么回事?

#define MEM_CLEAR 0
#define MEM_RE 1
#define MEM_SETSIZE 2

#define GLOBALMEM_SIZE 0x1000
#define GLOBALMEM_MAJOR 255

struct globalmem_dev
{
unsigned int count;
unsigned int size;
struct cdev cd;
unsigned char mem[GLOBALMEM_SIZE];
};
struct globalmem_dev *g_dev;

int globalmem_ioctl(struct inode *inodep,
  struct file *filp,unsigned int cmd,unsigned long arg)
{
  int i;
  char c;
  switch(cmd)
  {
    case MEM_CLEAR:
      memset(g_dev->mem,0,g_dev->count);
      printk(KERN_INFO "globalmem is set to zero\n");
      break;
    case MEM_RE:
      if(g_dev->count!=1)
        return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i <g_dev->size/2;i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=g_dev->mem[i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dev->mem[i]=g_dev->mem[g_dev->size-i-1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dev->mem[g_dev->size-i-1]=c;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case MEM_SETSIZE:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(arg <0 || arg>GLOBALMEM_SIZE)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dev->size=arg;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;default:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;}
&nbsp;&nbsp;return 0;


[ 本帖最后由 dreamice 于 2009-8-6 20:24 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2009-08-06 20:24 |只看该作者

回复 #1 79222470 的帖子

你应该查看一下,指示灯的硬件操作是否对

论坛徽章:
0
3 [报告]
发表于 2009-08-06 20:29 |只看该作者
回二楼:
问题我这个驱动不是操作指示灯的,它只是完成对一块内存区域的读写和定位~

论坛徽章:
0
4 [报告]
发表于 2009-08-06 21:25 |只看该作者
谁知道你这个内存地址设到什么地方去了

论坛徽章:
0
5 [报告]
发表于 2009-08-06 21:36 |只看该作者
原帖由 flag 于 2009-8-6 21:25 发表
谁知道你这个内存地址设到什么地方去了

我只是使用kmalloc开辟了一块内存~

论坛徽章:
0
6 [报告]
发表于 2009-08-06 21:54 |只看该作者
原帖由 79222470 于 2009-8-6 21:36 发表

我只是使用kmalloc开辟了一块内存~

那就是这个关键的部分没有列出来了

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2009-08-06 22:10 |只看该作者

回复 #6 flag 的帖子

内存与IO没有映射对

论坛徽章:
0
8 [报告]
发表于 2009-08-08 01:22 |只看该作者
分别注释代码,逐步定位

论坛徽章:
0
9 [报告]
发表于 2009-08-08 03:53 |只看该作者
然后键盘上数字键盘的指示灯灭掉,另外两个指示灯不停的闪,

一般是指kenel panic 发生了。这个时候的系统应该是没有任何反应的,只能重启。

按照你说的,是对内存读写,那可能是越界了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP