结构体 | |
struct | IATTR |
此结构用于记录 vnode 的属性 更多... | |
struct | Vnode |
vnode并不包含文件名,因为 vnode和文件名是 1:N 的关系 更多... | |
struct | VnodeOps |
类型定义 | |
typedef LOS_DL_LIST | LIST_HEAD |
typedef LOS_DL_LIST | LIST_ENTRY |
typedef int | VfsHashCmp(struct Vnode *vnode, void *arg) |
枚举 | |
enum | VnodeType { VNODE_TYPE_UNKNOWN , VNODE_TYPE_REG , VNODE_TYPE_DIR , VNODE_TYPE_BLK , VNODE_TYPE_CHR , VNODE_TYPE_BCHR , VNODE_TYPE_FIFO , VNODE_TYPE_LNK } |
函数 | |
int | VnodesInit (void) |
int | VnodeDevInit (void) |
设备初始化,设备结点:/dev目录下,对应一个设备,如/dev/mmcblk0 更多... | |
int | VnodeAlloc (struct VnodeOps *vop, struct Vnode **vnode) |
申请分配一个 vnode 节点,vop为操作节点的驱动程序 更多... | |
int | VnodeFree (struct Vnode *vnode) |
是否 vnode 节点 更多... | |
int | VnodeLookup (const char *path, struct Vnode **vnode, uint32_t flags) |
通过路径查询vnode节点 更多... | |
int | VnodeLookupFullpath (const char *fullpath, struct Vnode **vnode, uint32_t flags) |
根节点内部改变 更多... | |
int | VnodeLookupAt (const char *path, struct Vnode **vnode, uint32_t flags, struct Vnode *orgVnode) |
通过路径 查找索引节点.路径和节点是 N:1的关系, 硬链接 更多... | |
int | VnodeHold (void) |
拿锁,封装互斥量 更多... | |
int | VnodeDrop (void) |
归还锁 更多... | |
void | VnodeRefDec (struct Vnode *vnode) |
int | VnodeFreeAll (const struct Mount *mnt) |
释放mount下所有的索引节点 更多... | |
int | VnodeHashInit (void) |
uint32_t | VfsHashIndex (struct Vnode *vnode) |
通过节点获取哈希索引值 更多... | |
int | VfsHashGet (const struct Mount *mount, uint32_t hash, struct Vnode **vnode, VfsHashCmp *fun, void *arg) |
通过哈希值获取节点信息 更多... | |
void | VfsHashRemove (struct Vnode *vnode) |
从哈希链表中摘除索引节点 更多... | |
int | VfsHashInsert (struct Vnode *vnode, uint32_t hash) |
插入哈希表 更多... | |
void | ChangeRoot (struct Vnode *newRoot) |
改变根节点 更多... | |
BOOL | VnodeInUseIter (const struct Mount *mount) |
mount是否正在被某个索引节点使用 更多... | |
struct Vnode * | VnodeGetRoot (void) |
void | VnodeMemoryDump (void) |
mode_t | GetUmask (void) |
获取用户创建文件掩码 更多... | |
int | VfsPermissionCheck (uint fuid, uint fgid, mode_t fileMode, int accMode) |
int | VfsVnodePermissionCheck (const struct Vnode *node, int accMode) |
LIST_HEAD * | GetVnodeFreeList (void) |
LIST_HEAD * | GetVnodeActiveList (void) |
LIST_HEAD * | GetVnodeVirtualList (void) |
int | VnodeClearCache (void) |
typedef LOS_DL_LIST LIST_ENTRY |
typedef LOS_DL_LIST LIST_HEAD |
哈希比较指针函数,使用方法,例如: int VfsHashGet(const struct Mount *mount, uint32_t hash, struct Vnode **vnode, VfsHashCmp *fn, void *arg) VfsHashCmp *fn 等同于 int *fn, 此时 fn是个指针,指向了一个函数地址 fn(vnode,arg)就是调用这个函数,返回一个int类型的值
enum VnodeType |
Linux系统使用struct inode作为数据结构名称。BSD派生的系统,使用vnode名称,其中v表示“virtual file system” Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。 硬连接 硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号, 称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名), 则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件, A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。 硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述, 因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后, 文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。 # ln 源文件 目标文件 软连接 另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。 它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。 比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同, A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。 A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。 # ln -s 源文文件或目录 目标文件或目录 软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。 inode的特殊作用 由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。 1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。 2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。 3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。 第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。 更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件, 旧版文件的inode则被回收。
Vnode types. VNODE_TYPE_UNKNOWN means no type. | 节点类型
改变根节点
获取用户创建文件掩码
在文件 vfs_other.c 第 715 行定义.
int VfsHashGet | ( | const struct Mount * | mount, |
uint32_t | hash, | ||
struct Vnode ** | vnode, | ||
VfsHashCmp * | fun, | ||
void * | arg | ||
) |
通过哈希值获取节点信息
在文件 vnode_hash.c 第 89 行定义.
uint32_t VfsHashIndex | ( | struct Vnode * | vnode | ) |
插入哈希表
在文件 vnode_hash.c 第 128 行定义.
从哈希链表中摘除索引节点
在文件 vnode_hash.c 第 118 行定义.
在文件 vfs_other.c 第 80 行定义.
申请分配一个 vnode 节点,vop为操作节点的驱动程序
设备初始化,设备结点:/dev目录下,对应一个设备,如/dev/mmcblk0
归还锁
是否 vnode 节点
释放mount下所有的索引节点
拿锁,封装互斥量
mount是否正在被某个索引节点使用
通过路径查询vnode节点
int VnodeLookupAt | ( | const char * | path, |
struct Vnode ** | vnode, | ||
uint32_t | flags, | ||
struct Vnode * | orgVnode | ||
) |
通过路径 查找索引节点.路径和节点是 N:1的关系, 硬链接
根节点内部改变
#ifndef S_IRUSR #define S_ISUID 04000 #define S_ISGID 02000 #define S_ISVTX 01000 #define S_IRUSR 0400 #define S_IWUSR 0200 #define S_IXUSR 0100 #define S_IRWXU 0700 #define S_IRGRP 0040 #define S_IWGRP 0020 #define S_IXGRP 0010 #define S_IRWXG 0070 #define S_IROTH 0004 #define S_IWOTH 0002 #define S_IXOTH 0001 #define S_IRWXO 0007 #endif