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;
for(i=0;i <g_dev->size/2;i++){
c=g_dev->mem[i];
g_dev->mem[i]=g_dev->mem[g_dev->size-i-1];
g_dev->mem[g_dev->size-i-1]=c;
}
break;
case MEM_SETSIZE:
if(arg <0 || arg>GLOBALMEM_SIZE)
break;
g_dev->size=arg;
break;
default:
return -1;
}
return 0;
[ 本帖最后由 dreamice 于 2009-8-6 20:24 编辑 ]
回复 #1 79222470 的帖子
你应该查看一下,指示灯的硬件操作是否对 回二楼:问题我这个驱动不是操作指示灯的,它只是完成对一块内存区域的读写和定位~ 谁知道你这个内存地址设到什么地方去了 原帖由 flag 于 2009-8-6 21:25 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
谁知道你这个内存地址设到什么地方去了
我只是使用kmalloc开辟了一块内存~ 原帖由 79222470 于 2009-8-6 21:36 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
我只是使用kmalloc开辟了一块内存~
那就是这个关键的部分没有列出来了
回复 #6 flag 的帖子
内存与IO没有映射对 分别注释代码,逐步定位 然后键盘上数字键盘的指示灯灭掉,另外两个指示灯不停的闪,一般是指kenel panic 发生了。这个时候的系统应该是没有任何反应的,只能重启。
按照你说的,是对内存读写,那可能是越界了。
页:
[1]