bajdcc/MiniOS

两个BUG

Opened this issue · 0 comments

  1. 第一个BUG是IPC进程切换的问题,如进程SYSTASK和TASK1,当TASK1运行到RECV返回的时候,进程遭切换,切到SYSTASK,此时SYSTASK运行到SEND并成功返回,然而此时进程并没有切换,所以SYSTASK继续运行至RECV。这样,SYSTASK和TASK1同时是RECV状态,导致死锁。初步发现问题来自于ipc.c中的block函数,由于中断是非重入式的,仅最外层中断可以切换进程,内层中断若不返回则导致halt(因为这时proc_switch被屏蔽了),解决方法是强行int 0x20,触发irq0时钟中断(只要修改调度函数),从而切换当前进程。从设计角度,block必须立即返回,否则系统死循环,而参考的orange's代码设计是不允许多次block的(因为有一堆assert),所以这是个问题。。。
  2. 第二个BUG比较诡异,我在tss_reset中assert了proc->fi->cs < 0xF<<3。触发assert_failure时,会发现proc->fi竟然=原来的proc->fi+12!什么时候把proc->fi改了?要么就是iret的时候堆栈已经破坏了,我更相信是BUG1中的强制切换进程的问题。

当前代码没有出panic是因为我用了delay强行缓解了竞争……然而并不能解决问题,只能掩盖问题。看来这就是一场持久战。