1、用户空间和内核空间的交互:
unsigned long copy_to_user(void _ _user*to,const void* from ,unsigned long count);
unsigned long copy_from_user(void to , const void _ _user from ,unsigned long count);
2、原来这样也可以:
struct file_operations memdev_ops=
{
llseek : memdev_llseek ,
read : memdev_read ,
write : memdev_write ,
ioctl : NULL ,
open : memdev_open ,
release : memdev_release ,
};
3、看个例子,感觉又涨姿势啦:
#define MEMDEV_NR_DEVS 3
#define MEMDEV_SIZE 4096
typedef struct Mem_dev{
char * data;
Mem_dev * next;
unsigned long size;
}Mem_dev;
Mem_dev* mem_devices; mem_devices=kmalloc(MEMDEV_NR_DEVS*sizeof(Mem_dev),GFP_KERNEL);
if(!mem_devices)
{
result=-ENOMEM;
goto ↓fail;
}
memset(mem_devices , 0 , MEMDEV_NR_DEVS*sizeof(Mem_dev));
for(i=0 ; i<MEMDEV_NR_DEVS ; i++)
{
mem_devices[i].size=MEMDEV_SIZE;
mem_devices[i].data=kmalloc(MEMDEV_SIZE,GFP_KERNEL);
memset(mem_devices[i].data , 0 , MEMDEV_SIZE);
}
return 0;
fail:
memdev_cleanup_module();
return result;
分析:利用typedef定义一个结构体指针mem_devices,为它申请一块大小为3*sizeof(Mem_dev)连续空间,首地址给mem_devices。重点来了,我们此时可以将这个首地址看作是一个数组的首地址哦,每个成员类型都是Mem_dev类型的。所以在后面的for循环中直接用数组的形式对这块内存空间进行操作,mem_devices[i].data表示这个数组中的下标为i的成员中的 data成员。注意mem_devices[i]表示的是数组中具体的成员(是一个变量而不是指针),所以用”.”的形式来访问这个结构体中的成员。