79222470 发表于 2009-08-06 19:48

ioctl的实现问题

这是驱动中的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 编辑 ]

dreamice 发表于 2009-08-06 20:24

回复 #1 79222470 的帖子

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

79222470 发表于 2009-08-06 20:29

回二楼:
问题我这个驱动不是操作指示灯的,它只是完成对一块内存区域的读写和定位~

flag 发表于 2009-08-06 21:25

谁知道你这个内存地址设到什么地方去了

79222470 发表于 2009-08-06 21:36

原帖由 flag 于 2009-8-6 21:25 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
谁知道你这个内存地址设到什么地方去了
我只是使用kmalloc开辟了一块内存~

flag 发表于 2009-08-06 21:54

原帖由 79222470 于 2009-8-6 21:36 发表 http://linux.chinaunix.net/bbs/images/common/back.gif

我只是使用kmalloc开辟了一块内存~
那就是这个关键的部分没有列出来了

dreamice 发表于 2009-08-06 22:10

回复 #6 flag 的帖子

内存与IO没有映射对

emmoblin 发表于 2009-08-08 01:22

分别注释代码,逐步定位

llzzccc 发表于 2009-08-08 03:53

然后键盘上数字键盘的指示灯灭掉,另外两个指示灯不停的闪,

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

按照你说的,是对内存读写,那可能是越界了。
页: [1]
查看完整版本: ioctl的实现问题