文件操作函数调用

读取硬盘引导块的缓冲块

main
init
setup
sys_setup
bread
getblk
get_hash_table
find_buffer
remove_from queues
insert_into_queues
ll_rw_block
make_request
add_request
do_hd_request
hd_out
wait_on_buffer
sleep_on
schedule
brelse
  • 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格式化虚拟盘,设为根设备

sys_setup
rd_load
breada
  • breada()用于读取指定的数据块,并标出还需要读的块,然后返回含有数据块的缓冲区指针。

进程1在根设备虚拟盘加载根文件系统

sys_setup
mount_root
read_super
get_super
bread
iget
get_empty_inode
wait_on_inode
read_inode
lock_inode
get_super
bread
brelse
unlock_inode

-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
dir_namei
get_dir
find_entry
iget
read_super
  • sys_mount往一个目录名上加载一个文件系统
  • namei:根据设备文件名找到对应的 i 节点,获取目录文件i节点
  • get_dir:根据给出的路径名进行搜索,直到达到最顶端的目录。
  • dir_namei:返回指定目录名的 i 节点指针,以及在最顶层目录的名称
  • read_super:读取将安装文件系统的超级块

sb->s_imount=dir_i

打开文件

sys_open
open_namei
dir_namei
get_dir
find_entry
iget
read_inode
  • 在进程filp[20]查找一个空闲项
  • 在file_table[64]查找一个空闲项
  • 挂接,并计数(current->filp[fd]=f)->f_count++;
  • 找到文件i节点,挂接file_table[64]

读文件

sys_read
file_read
bmap
_bmap
bread
iget
read_inode
  • bmap返回block 数据块对应在设备上的逻辑块号
  • _bmap考虑直接块(7),一级间接块(512),二级间接块(512*512)
  • 将缓冲块数据载入主内存
  • 读出了一个数据块(1KB)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值