*dev=filp->private_data;这一句的理解

ldd3中说到open应完成以下工作:

1.检查设备特定的错误(注入设备未就绪或类似的硬件问题)。

2.如果设备是首次打开,则对其进行初始化。

3.如有必要,更新f_op指针。

4.分配并填写置于filp->private_data里的数据结构。

关于第4点,一直心存余虑,不明白是什么意思,看网上写的很多其他的例子,也没有做第4点的操作。

其实ldd3上面已经在release方法里面做了说明,“并不是每个close系统调用都会引起对release方法的调用,只有真正释放设备数据结构的close才会调用release方法的调用。内核对每个file结构维护其被使用多少次的计数器。对于dup/fork等系统调用,并不会创建新的数据结构(仅由open创建,在open函数中通过申请并初始化的cdev结构,运用container_of求出包含cdev的scull_dev结构,并赋值给filp->private_data,从而分配一个新的数据结构),他们只是增加对数据结构的计数。当file结构的计数减为零时,才会调用close,执行release.”

我觉得这样设计有两个目的,一是节省系统资源,二是可以与进程的设计理念相一致。

————————————————————————————————————————————————————————————

我自己看宋宝华的linux设备驱动开发详解,93页写到私有数据指针private_data在设备驱动中被广泛使用,大多数指向设备驱动自定义用于描述设备的结构体。

你可能感兴趣的:(嵌入式Linux相关知识汇总)