MIT6.828_HW7_xv6 locking
Don’t do this
Make sure you understand what would happen if the xv6 kernel executed the following code snippet:
struct spinlock lk;
initlock(&lk, "test lock");
acquire(&lk);
acquire(&lk);
查看acquire源码,可以发现若连续两次对同一变量进行acquire,会进入panic。
Interrupts in ide.c
在acquire中,会关中断,实现原子操作。pushcli(); // disable interrupts to avoid deadlock.
让我们看看如果我们在持有ide锁时打开中断会发生什么。 在ide.c中的iderw中,在acquire()之后添加对sti()的调用,并在release()之前调用cli()。rebulid 内核并在QEMU中启动它。 内核在启动后很快就会panic; 如果没有,多尝试启动QEMU几次。
acquire(&idelock); //DOC:acquire-lock
// sti();
// Append b to idequeue.
b->qnext = 0;
for(pp=&idequeue; *pp; pp=&(*pp)->qnext) //DOC:insert-queue
;
*pp = b;

本文讨论了MIT6.828课程作业7中关于xv6操作系统的锁机制。文章提到了不应连续两次获取同一锁,分析了在ide.c和file.c中执行中断时持有锁的影响,以及xv6锁释放过程中清除pcs[0]和cpu的原因。实验结果显示,开启中断可能导致内核崩溃,而filealloc的短时操作降低了冲突概率。
最低0.47元/天 解锁文章
524

被折叠的 条评论
为什么被折叠?



