在内核解开rootfs.initramfs之后,VFS就在内核建立了一棵树,我们写一段简单的代码对这个树进行遍历:
static void VFSWalk(CVFSWalk* pWalk, void* pParent, dentry* pEntry)
{
// 插入所有的子节点
struct dentry* pNode;
void* pLast = NULL;
list_for_each_entry(struct dentry, pNode, &pEntry->d_subdirs, d_u.d_child)
{
pLast = pWalk->Insert((char*)pNode->d_name.name, pParent, pLast);
VFSWalk(pWalk, pLast, pNode);
}
}
void VFSWalk(CVFSWalk* pWalk)
{
// 插入所有的节点
struct dentry* pEntry = current->nsproxy->mnt_ns->root->mnt_root;
void* pRoot = pWalk->Insert("/", NULL, NULL);
VFSWalk(pWalk, pRoot, pEntry);
}
在这里CVFSWalk封装了CTreeCtrl的InsertItem函数,这样每在VFS中找到一个节点就在树控件上相应地创建一项。
遍历从根文件系统的dentry开始,只使用struct dentry结构体的d_subdirs成员。
从实验结果验证了:
1、每一个普通文件或者目录都用一个dentry结构体来表示。
2、对于链接到目录的符号文件,dentry的子节点为空。
嗯,继续内核的学习之路~~~
近日,我家6岁的小姑娘参加了第六届POP全国少儿英语风采大赛,拉票进行中(2011-6-15前)。
请帮忙点击新东方网站的链接:
http://popdasai.xdf.cn/toupiao.php?do=space&uid=4237
投她一票,谢谢!