当前位置: 技术问答>linux和unix
ioctl的实现
来源: 互联网 发布时间:2016-06-22
本文导语: 这是驱动中的ioctl函数,当系统以调用这个函数时,就立刻卡住了 然后键盘上数字键盘的指示灯灭掉,另外两个指示灯不停的闪,不知道是怎么回事? #define MEM_CLEAR 0 #define MEM_RE 1 #define MEM_SETSIZE 2 #define GLOBALMEM_S...
这是驱动中的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 zeron");
break;
case MEM_RE:
if(g_dev->count!=1)
return -1;
for(i=0;isize/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(argGLOBALMEM_SIZE)
break;
g_dev->size=arg;
break;
default:
return -1;
}
return 0;
}
#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 zeron");
break;
case MEM_RE:
if(g_dev->count!=1)
return -1;
for(i=0;isize/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(argGLOBALMEM_SIZE)
break;
g_dev->size=arg;
break;
default:
return -1;
}
return 0;
}
|
这个楼主可以进一步的调试嘛!
首先打印出cmd的值,看看到底是MEM_SETSIZE,MEM_RE,MEM_CLEAR中的哪个?
在这就是check g_dev这个结构里面的值,特别mem,哪里分配来的,如果没有初始化,嘿嘿。
首先打印出cmd的值,看看到底是MEM_SETSIZE,MEM_RE,MEM_CLEAR中的哪个?
在这就是check g_dev这个结构里面的值,特别mem,哪里分配来的,如果没有初始化,嘿嘿。