2.6内核中并不要求模块在open中显示的实现使用计数,真正使用模块使用计数是在chrdev_open()中完成的。

内核源码fs/char_dev.c

static int chrdev_open(struct inode *inode, struct file *filp)

{

struct cdev *p;

……

cdev_get(p); //增加cdev中owner指向的module的使用计数

……

filp-》f_op = fops_get(p-》ops);}// 增加file_operations中owner指向的module的使用计数

if (filp-》f_op-》open) {

lock_kernel();

ret = filp-》f_op-》open(inode,filp);//调用到设备驱动中的open

unlock_kernel();

}

}

static struct kobject *cdev_get(struct cdev *p)

{

struct module *owner = p-》owner;

……

if (owner && !try_module_get(owner))

return NULL;

……

}

内核源码Include/linux/fs.h

#define fops_get(fops) /

(((fops) && try_module_get((fops)-》owner) ? (fops) : NULL))

关闭设备的大体流程

sys_close()-》filp_close()-》fput()-》__fput()-》release()

2.6内核中并不要求模块在release中显示的实现使用计数,真正使用模块使用计数是在__fput()中完成的。

void __fput(struct file *file)

{

struct dentry *dentry = file-》f_path.dentry;

struct vfsmount *mnt = file-》f_path.mnt;

struct inode *inode = dentry-》d_inode;

if (file-》f_op && file-》f_op-》release)

file-》f_op-》release(inode, file);//调用到设备驱动中的release

……

cdev_put(inode-》i_cdev); //减少cdev中owner指向的module的使用计数

……

fops_put(file-》f_op);// 减少file_operations中owner指向的module的使用计数

……

}

关于嵌入式技术就介绍完了,您有什么想法可以联系小编。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查