其实这不属于文件系统的bug,这应该属于进程的bu,不知道有没有跑过第九章文件系统的最后代码的,是一个和linux下文件系统调用一样的范例。
一开始感觉TestB()和TestC()这两个进程没用,这两个实际进程没做什么,就是Print一下,然后就死循环了,然后就删掉了,只留下了个进程TestA(),然后问题就出现了总是报异常,但是另外两个进程加上去之后就没事了,很不解。
后来发现,文件系统也是由一个系统级的进程写入硬盘的,在mkfs()写入过程中后该进程就陷入阻塞等待硬盘说写完的中断后才能解除,而TestA中是需要用到这个文件系统的,由于进程的轮转导致文件系统还没初始化好就切换到进程TestA的运行了,就导致挂了,当加入TestB()和TestC()之后,由于进程调度schedule所需要的时间更长了,导致在切换进程TestA的时候,硬盘已经将磁盘文件系统写入,并告诉虚拟文件系统初始化完毕这个时候就可以了。
为此我把Testc()和Testb()两个进程删除之后,在TestA()中开始涉及到使用文件系统之前先加个延时million_delay(200)让文件系统初始化完毕先再运行。
问题大概是定位到这里,但实际上在原因上究竟是不是由于磁盘文件没有初始化完毕导致TestA()挂掉我也不是很确定,因为在orange’s的系统调用此时已经改成微内核的消息传递了,如果文件系统没有初始化完毕, TestA()就进行系统调用,按道理是会把消息挂在它的待接收队列上的,应该不会出现问题才对,由于没时间,下次再回它的IPC看看是不是哪里么写到。