Open SilverRainZ opened 9 years ago
当执行用户级别的 getchar() 时,过多地调用 printl() 打印 log 似乎会导致奇怪的 panic,比如 Invaild OPCode 或者 GenernalPortection,亦可能导致键盘无响应:无法进入 kb_handle() 函数,而时钟中断正常。
getchar()
printl()
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
无法稳定复现该 bug,猜测是因为多个进程对 proc 变量和 ptable 表的操作产生的冲突。
有趣的现象:
进程一 init 有时会在 0xc000000d 处发生错误,出错指令是 int 0x80,但实际上进程一的 0xc000000d 处是 jmp $ ,对于其他用户程序,0xc0000000 处才是 int 0x80指令,即,进程空间和 proc 变量不对应。
init
0xc000000d
int 0x80
jmp $
0xc0000000
当执行用户级别的
getchar()
时,过多地调用printl()
打印 log 似乎会导致奇怪的 panic,比如 Invaild OPCode 或者 GenernalPortection,亦可能导致键盘无响应:无法进入kb_handle()
函数,而时钟中断正常。如果将
printl()
替换为空语句,问题似乎不再出现,但是现在 log 仍然非常需要,因此暂不改动。 这可能和printl()
中的 IO 操作比较耗时有关系。