背景是这样的:前几天看了linux上switch_to的代码,觉得太绕,决定不模仿它,继续用自己发明的pregs。pregs是一个浮动指针,指着内核进程被中断时保存的stack_frame。
schedule()重写之后,只创建一个idle进程,测试,发现输出几行信息就死循环了:
点击(此处)折叠或打开
- 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();
-
}
-
}
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,是写代码时脑子太浑了。