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的使用计数

……

}

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