Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58223
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 15:04
文章分类

全部博文(13)

文章存档

2015年(13)

我的朋友

分类: LINUX

2015-05-11 11:01:15

  是papaya内核上的一个bug。
  背景是这样的:前几天看了linux上switch_to的代码,觉得太绕,决定不模仿它,继续用自己发明的pregs。pregs是一个浮动指针,指着内核进程被中断时保存的stack_frame。
  schedule()重写之后,只创建一个idle进程,测试,发现输出几行信息就死循环了:

点击(此处)折叠或打开

  1. idle..
  2. schedule..
  3. idle..
下面是schedule和idle的代码。

点击(此处)折叠或打开

  1. void schedule(void){
  2.     oprintf("schedule..\n");
  3.     __asm__("cli");
  4.         ......
  5.         ......
  6.     __asm__ __volatile__("movl %0, %%esp\n\t"
  7.                         :
  8.                         :"r"(next->pregs));
  9. }
  10. void idle(void){
  11.     while(1){
  12.         oprintf("hlt..\n");
  13.         __asm__("hlt");
  14.         schedule();
  15.     }
  16. }
  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) |
0

上一篇:没有了

下一篇:linux的switch_to

给主人留下些什么吧!~~