SilverRainZ / OS67

An unix-like toy kernel
GNU General Public License v3.0
725 stars 124 forks source link

输入和执行命令有机率导致键盘失灵或者 Panic。 #2

Open SilverRainZ opened 9 years ago

SilverRainZ commented 9 years ago

当执行用户级别的 getchar() 时,过多地调用 printl() 打印 log 似乎会导致奇怪的 panic,比如 Invaild OPCode 或者 GenernalPortection,亦可能导致键盘无响应:无法进入 kb_handle() 函数,而时钟中断正常。

如果将 printl() 替换为空语句,问题似乎不再出现,但是现在 log 仍然非常需要,因此暂不改动。 这可能和 printl() 中的 IO 操作比较耗时有关系。

  #ifdef __LOG_ON
- #define printl(...) _printl(__VA_ARGS__)
+ #define printl(...) ;
  #else
- #define printl(...) _print_null(__VA_ARGS__)
+ #define printl(...) ;
  #endif
SilverRainZ commented 9 years ago

无法稳定复现该 bug,猜测是因为多个进程对 proc 变量和 ptable 表的操作产生的冲突。

有趣的现象:

进程一 init 有时会在 0xc000000d 处发生错误,出错指令是 int 0x80,但实际上进程一的 0xc000000d 处是 jmp $ ,对于其他用户程序,0xc0000000 处才是 int 0x80指令,即,进程空间和 proc 变量不对应。