本章是minix关于文件读写的部分及其他常用的调用函数。
五、VFS
l 文件系统的总循环(/servers/vfs/main.c)
1、get_work接收信息设置全局变量who为调用者的进程表项号,把call_nr设置为即将执行的系统调用的编号。
2、判断如果消息请求是唤醒之前堵塞在管道或终端的进程,返回该进程的端点并唤醒该进程
3、根据不同的请求,比如重新打开、关闭等执行应答
4、处理特殊信息,如果请求是通知,且来自时钟,检查定时器是否已经过期,如果有必要则更新定时器队列
5、如果通知的发送者是DS,从DS获得事件和用户,并检查由VFS驱动的事件
6、如果通知的发送者是其他设备,则认为一个设备驱动程序已经就绪,调用dev_status处理
7、指向调用者的进程表入口,检查该进程是否被挂起,这种情况下返回的状态码被忽略,提示出错
8、如果消息发送者是PM,则调用service_pm根据消息的类型处理最后发送给PM处理应答消息
9、如果进程被堵塞,则不用发送应答消息
l 文件系统的初始化(/servers/vfs/main.c/sef_cb_init_fresh)
1、清空进程的端点区域
2、循环接收信息获得PM的pm_init初始化函数发出的消息,消息包括进程号、插槽数量和PID,设置用户的真实、有效PID等参数,直到收到进程号字段的值为“NONE”的消息则结束循环,发送同步消息给PM
3、调用build_map初始化dmap表,dmap表项对于每个设备提供了主设备号和响应的设备驱动程序之间的映射,当一个设备被打开、关闭、读或写的时候,dmap会提供响应操作的处理函数的名字
4、将所有设备的驱动程序加入到引导映像中,并初始化根设备和载入超级块
5、遍历进程表的文件系统部分,这样从引导映像中装入的每一个进程都可以识别根目录,并使用根目录作为工作目录
l 创建和打开文件(/servers/vfs/open.c)
1、do_creat函数提取文件名和文件长度,再调用common_open创建新文件并设