xv6 locking

xv6 Locking

1、运行代码后,会发生死锁现象,CPU在最后一句处于忙等状态;
2、在ide.c文件中的iderw函数中添加sti()和cli()的调用:

xv6 locking

运行make qemu-nox,结果如下图所示:
xv6 locking

由panic得出的eip值,在kernel.asm文件中找到trace对应的语句,就是刚刚执行的语句,内容如下:
80104335: panic(“acquire”);
80102033: if((b=idequeue)==0){
801059a5: lapiceoi();
801056eb: addl $4, %esp
80100183: iderw(b);
80102b75: log.lh.n = lh->n
80103850: innitlog(ROOTDEV);
801056ee: # Return falls through to trapret…
3、注释掉ide.c中的iderw函数的相应位置中对sti()和cli()函数进行添加,并如下图所示对file.c的filealloc()进行类似修改。注意文件顶部要添加#include “x86.h”
xv6 locking
xv6 locking

运行结果正常,没出现panic,因为filealloc占用时间短,只有极小概率与其他读写文件发生冲突
4、如果交换这两个顺序,其他正在忙等待的运行程序可能会立刻执行,但lk中的pcs以及cpu数据还未编程默认值,此时其他程序再去执行aquire(lk)时,可能会出现lk内值错误。