是papaya内核上的一个bug。
背景是这样的:前几天看了linux上switch_to的代码,觉得太绕,决定不模仿它,继续用自己发明的pregs。pregs是一个浮动指针,指着内核进程被中断时保存的stack_frame。
schedule()重写之后,只创建一个idle进程,测试,发现输出几行信息就死循环了:
下面是schedule和idle的代码。
-
void schedule(void){
-
oprintf("schedule..\n");
-
__asm__("cli");
-
......
-
......
-
__asm__ __volatile__("movl %0, %%esp\n\t"
-
:
-
:"r"(next->pregs));
-
}
-
void idle(void){
-
while(1){
-
oprintf("hlt..\n");
-
__asm__("hlt");
-
schedule();
-
}
-
}
idle进程频繁的被时钟中断,按理说该源源不断的输出。所以怀疑是系统被cli了。朝这个方向分析一下,果然,恰好吻合这三条输出。下面来模拟出bug的过程:
1,idle进程运行,打印"hlt..",然后hlt住。
2,时钟中断发生,idle被中断,在堆栈上保存了一块regs,task_struct.pregs被更新。
3,idle恢复运行,从__asm__("hlt")的下一条指令接着运行。也就是执行schedule()。
4,到目前为止,一切都是正常的。现在idle进程正常运行,它执行schedule函数,先是输出"schedule..."。但执行到__asm__("cli") 这一句,cpu就被cli了。执行完schedule,然后while(1),输出一条"hlt..",CPU挂住,因为cli了,系统也就停了。
没什么技术含量的bug,是写代码时脑子太浑了。
阅读(1387) | 评论(0) | 转发(0) |