读取硬盘引导块的缓冲块
- sys_setup只在初始化时被调用一次。用静态变量 callable 作为可调用标志。
//sys_setup()
if (!(bh = bread(0x300 + drive*5,0))) { // 0x300, 0x305 逻辑设备号。
printk("Unable to read partition table of drive %d\n\r", drive);
panic("");
}
- getblk在高速缓冲中申请一块缓冲区
- get_hash_table:如果指定块已经在高速缓冲中,则返回对应缓冲区头指针,用现成的
- ll_rw_block是创建块设备读写请求项并插入到指定块设备请求队列中
- 等待硬盘读数据,进程调度从1->0,硬盘读取完,硬盘中断,只读了一半,继续读盘,中断,读完end_request。切换到进程1
进程1格式化虚拟盘,设为根设备
- breada()用于读取指定的数据块,并标出还需要读的块,然后返回含有数据块的缓冲区指针。
进程1在根设备虚拟盘加载根文件系统
-super_block[8]
!!!
- read_super:从设备上读取超级块到缓冲区,如果该设备的超级块已经在高速缓冲中并且有效(get_super),则直接返回该超级块的指针;否则,首先在超级块数组中找出一个空项(也即其 s_dev=0 的项)
- iget:从设备上读取文件系统的根 i 节点
- read_inode:从设备上读取指定 i 节点的信息到内存中(缓冲区中), 该 i 节点所在的逻辑块号 = (启动块+超级块) + i 节点位图占用的块数 + 逻辑块位图占用的块数 + (i 节点号-1)/每块含有的 i 节点数。
将inode_table[32]中代表虚拟盘根i节点的项挂接到super_block[8]中代表根设备虚拟盘的项中的s_isup, s_imount指针上。
sys_setup全部执行完毕。
安装文件系统
- sys_mount往一个目录名上加载一个文件系统
- namei:根据设备文件名找到对应的 i 节点,获取目录文件i节点
- get_dir:根据给出的路径名进行搜索,直到达到最顶端的目录。
- dir_namei:返回指定目录名的 i 节点指针,以及在最顶层目录的名称
- read_super:读取将安装文件系统的超级块
sb->s_imount=dir_i
打开文件
- 在进程filp[20]查找一个空闲项
- 在file_table[64]查找一个空闲项
- 挂接,并计数
(current->filp[fd]=f)->f_count++;
- 找到文件i节点,挂接file_table[64]
读文件
- bmap返回block 数据块对应在设备上的逻辑块号
- _bmap考虑直接块(7),一级间接块(512),二级间接块(512*512)
- 将缓冲块数据载入主内存
- 读出了一个数据块(1KB)