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的使用计数
……
}
关于嵌入式技术就介绍完了,您有什么想法可以联系小编。