1. 挂载文件系统
当前系统已经完成了根文件系统的挂载,将要挂载新的文件系统。
新的文件系统挂载在根文件系统的某个目录的inode上。
1)将硬盘的超级块读出,载入系统的super_block[8]中
2)从根文件系统读出指定的inode,载入inode_table[32]
3)将硬盘的超级块挂接到inode_table[32]中指定的i节点上。
在shell中输入 mount /dev/hd1 /mnt命令来安装文件系统。
注意硬盘可以分区,每个分区算一个设备 /dev/hd1 就是一个设备。
挂接部分详解
2. 示例展示1
展示单进程打开并读取文件,文件系统的工作原理
2.1 打开文件
1)将用户进程task_struct的 *filp[20] 与内核的 file_table[64]挂接
2)将用户进程需要打开的文件对应的inode在file_table[64]中进行登记
打开过程分三步:
1)将用户进程task_struct的 *filp[20] 与内核的 file_table[64]挂接
2)用给定路径名 /mnt/user/user1/user2/hello.txt 为线索,找到hello.txt文件的inode
3)将inode在file_table[64]中进行登记
2.1.1 分配fd和file_struct
2.1.2 获取inode
文件路径名:/mnt/user/user1/user2/hello.txt
解析方法
2.1.2.1 获得枝梢目录的inode
所以 get_dir 会多次调用 iget和 find_entry ,以此获得 mnt,user,user1,user2的 inode,最终获得枝梢文件user2的inode,并返回
2.1.2.2 获得目标文件的inode
2.1.2 将inode和 file_struct 挂接
2.2 读文件
2.2.1 确定数据块在外设的位置
下面介绍inode如何管理文件
inode通过他的 i_zone 结构来管理文件数据块,
2.2.2 将数据块读入缓冲块
2.2.3 将缓冲区数据复制到进程空间
3. 示例展示2——新建文件,并写文件
3.1 sys_creat
3.1.1 找目录项是否存在
3.1.2 新建目录项
create标志置位,不等于就要创建一个新数据块,必须确保文件的下一个文件块不存在,即!inode->i_zone[……]或!i成立,才能创建新
数据块。比如本实例中加载目录项的内容,一个数据块中没有发现空闲项,很可能下一个数据块中就有,如果强行分配新数据块,就会把已有的块覆盖掉,导致目录
文件管理混乱。
3.1.3 写文件
操作系统对写文件操作的规定是:进程空间的数据先要写入缓冲区中,然后操作系统在适当的条件下,将缓冲区中的数据同步到外设上。而且,操作系统只能以数据
块(1 KB)为单位,将缓冲区中的缓冲块(1
KB)的数据同步到外设上。这就需要在同步之前,缓冲块与外设上要写入的逻辑块进行一对一绑定,确定外设上的写入位置,以此保证用户空间写入缓冲块的数
据,能够准确地同步到指定逻辑块中。
3.1.3.1 确定写的位置
3.1.3.2 申请缓存块
3.1.3.3 将数据复制到缓冲块
此时,用户进程指定的数据,只是写入缓冲区中,并未写入硬盘。下面介绍数据从缓冲区同步到硬盘的方式。
3.1.4 数据同步到外设
数据从缓冲区同步到硬盘有两种方法。一种是updata定期同步;另一种是因缓冲区使用达到极限,操作系统强行同步。
3.1.4.1 update同步
由shell启动的update进程,该进程会调用pause()函数,这个函数会映射到sys_pause()函数中,使该进程被设置为可中断等待状态。每隔一段时间,操作系统就将updata进程唤醒。它执行后,调用sync()函数,将缓冲区中的数据同步到外设上。
sync()函数最终映射到sys_sync()系统调用函数去执行。为了保证文件内容同步的完整性,需要将文件i节点位图、文件i节点、文件数据块、数
据块对应的逻辑块位图,全都同步到外设。sys_sync()函数先将改动过的文件i节点写入缓冲区(其余内容已经在缓冲区中了),之后,遍历整个缓冲
区,只要发现其中缓冲块内容被改动过(b_dirt被置1),就全部同步到外设上。
同步inode
3.1.4.2 缓冲区满同步
当要写的数据缓冲区已经装不下,则需要同步缓冲区中的旧数据。
3.1.5 修改文件
修改文件就是在文件任意位置插入,删除数据,且不影响文件已有数据。
3.1.5.1 重定位文件当前指针
假设已有文件 hello.txt,内容为 hello 这下面程序能将文件改为 hello,Liuxword
3.1.6 关闭文件
释放inode
3.1.7 删除文件