目录解析代码
open_namei(filename,flag,&inode),解析路径
filename,根据文件名把inode弄进来写到&inde上
pathname路径名
if((c=get_fs_byte(pathname))=='/'),如果是'/'就从根目录开始,不是就从当前目录开始
current->root是根目录的inode
由于每次访问都是从根目录开始,父进程也是从根目录开始,子进程是拷贝了父进程所以也是冲根目录开始
根据目录的inode找到根目录里的数据内容,数据内容是一堆目录项,每个目录项是一个文件名字符串加一个文件对应的inode所对应的数组编号
find_entry,从目录中读取目录项
inr=de->inode这一项文件对应的inode编号
iget(idev,inr)把下一层的编号发进来就可以把下一层的inode读进来在循环
init(void)挂载硬盘
mount_root()挂载根目录
iget(ROOR_DEV,ROOT_INO)根据根目录所对应的inode编号找到就可把根目录读进来,ROOT_INO=1.
current->root=mi将根目录的inode读进来
get_supe(inode->dev)获得超级块
block=2+sb->s_imap_blocks+sb->zmap_block+(inodee->i_num-1)/INODES_PER_BLOCK
2,从0开始引导块和超级块各占一块,所以是从2开始
sb->s_imap_blocks,inode位图
sb->s_zmap_block 盘块位图
(inode->i_num-1),要读的 inode编号
(inode->i_num-1)/INODES_PER_BLOCK(一个块有多少个inode)
break(inode->i_dev,block)去磁盘上读块
hb->data[(inode->i_num-1)%INODES_PER_BLOCK],通过解析把需要的inode从盘上拿出来
find_entry找到目录所对应的编号
int block=(*dir)->i_zone[0]找直接索引块
bread((*dir)->i_dev,block)把块读出来
dir_entry*de=bh->b_date;将数据读进内存缓冲区
if(match(namelen,name,de))然后挨个匹配,能匹配直接返回,不能就继续循环
读取所有目录然后进行比较