如何对inode结构执行mmap操作
struct inode, struct dentry, struct file
- struct file是对打开文件的抽象,每个进程都有一个fd table,一个fd对应一个struct file
- struct dentry是对文件系统里一个路径的抽象,即一个逻辑文件。(目录是一种特殊的文件)
- struct inode是对磁盘里一个文件的抽象,即一个物理文件。
- 多个struct file可以指向同一个struct dentry,即一个文件被多次打开。
- 多个struct dentry可以指向同一个struct inode,即文件系统中有不同路径链接到同一个物理文件。
如何对一个struct inode执行mmap操作
- kernel里执行mmap操作的API是vm_mmap,vm_mmap操作的对象是struct file。
- 获得一个struct file的API是filp_open,filp_open接受的是一个path。
- 每一个path都对应一个struct dentry,一个struct inode对应多个struct dentry。
以下代码,仅考虑映射struct inode对应的文件(如果需要指定路径,则需要多一个遍历过程):
struct file *d_open_inode(struct inode *inode)
{
struct dentry *alias;
char *name = __getname(), *p;
struct file *d_file = NULL;
if (hlist_empty(&inode->i_dentry))
return NULL;
spin_lock(&inode->i_lock);
alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
p = dentry_path_raw(alias, name, PATH_MAX);
if (IS_ERR(p)) {
goto out_unlock;
}
d_file = filp_open(p, O_RDWR, 0);
out_unlock:
__putname(name);
spin_unlock(&inode->i_lock);
return d_file;
}