第五章 文件系统的系统调用 本章主要介绍针对上层用户使用的系统调用。用户通 过使用本章介绍的系统调用来申请操作系统中有关文件和 文件系统操作的各项功能。 本章介绍的算法是基于第四章所介绍的底层文件系统算 法之上的,主要包括七大类操作: 返回文件描述符类操作 路径名转换类操作 分配索引节点类操作 文件属性类操作 文件输入输出类操作 文件系统装卸类操作 文件系统目录树操作 1
第五章 文件系统的系统调用 本章主要介绍针对上层用户使用的系统调用。用户通 过使用本章介绍的系统调用来申请操作系统中有关文件和 文件系统操作的各项功能。 本章介绍的算法是基于第四章所介绍的底层文件系统算 法之上的,主要包括七大类操作: 返回文件描述符类操作 路径名转换类操作 分配索引节点类操作 文件属性类操作 文件输入输出类操作 文件系统装卸类操作 文件系统目录树操作 1
系统调用 返回文件描述符 使用namei 分配索引节点 文件属性 文件I/0 文件系统结构 目录树操作 open dup open stat creat creat chown read mount chdir creat pipe link chdir unlink mknod chmod write umount chroot close chroot mknod chown link stat stat mount chmod umount unlink 底层文件系统算法 namei ialloc ifree alloc free bmap iget iput 缓冲区分配算法 getblk brelse bread breada bwrite 2
系 统 调 用 返回文件描述符 使用namei 分配索引节点 文件属性 文件I/O 文件系统结构 目录树操作 open dup open stat creat creat chown read mount chdir creat pipe link chdir unlink mknod chmod write umount chroot close chroot mknod chown link stat stat mount chmod umount unlink 2 底层文件系统算法 namei ialloc ifree alloc free bmap iget iput 缓冲区分配算法 getblk brelse bread breada bwrite
1、算法open 输入:文件名 打开文件类型 文件许可权方式(对以创建方式打开而言) 输出:文件描述符 { 将文件名转换为索引节点(算法namei); f(文件不存在或不允许存取) return(错); 为索引节点分配系统打开文件表项,设置引用计数和偏移量; 分配用户文件描述符表项,将指针指向系统打开文件表项; f(打开的类型规定清除文件) 释放占用的所有文件系统块(算法free); 解锁(索引节点);:在上面的namei算法中上了锁*/ return(用户文件描述符); } 3
3 1、算法 open 输入:文件名 打开文件类型 文件许可权方式(对以创建方式打开而言) 输出:文件描述符 { 将文件名转换为索引节点(算法namei); if (文件不存在或不允许存取) return (错); 为索引节点分配系统打开文件表项,设置引用计数和偏移量; 分配用户文件描述符表项,将指针指向系统打开文件表项; if (打开的类型规定清除文件) 释放占用的所有文件系统块(算法free); 解锁(索引节点); /* 在上面的namei算法中上了锁 */ return(用户文件描述符); }
假定一个进程执行下列代码: fd1=open("/etc/passwd",ORDONLY) fd2=open("local",O WRONLY); fd3=open("/etc/passwd",O RDWR) 下图为打开文件后的数据结构: 4
假定一个进程执行下列代码: fd1=open(“/etc/passwd”,O_RDONLY); fd2=open(“local”,O_WRONLY); fd3=open(“/etc/passwd”,O_RDWR); 下图为打开文件后的数据结构: 4
用户文件描述符表 系统打开文件表 活动inode表 0 1 23 4567 引用数1 只读 引用数2 letc/passwd 引用数1 读写 引用数1 local 引用数1 只写 5
5 . . . . . 用户文件描述符表 0 1 2 3 4 5 6 7 . . . . . 系统打开文件表 活动 inode表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 引用数 1 只读 引用数 1 读写 引用数 1 只写 引用数2 /etc/passwd 引用数1 local