驱动复习(mor8)

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]表示的是数组中具体的成员(是一个变量而不是指针),所以用”.”的形式来访问这个结构体中的成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值