程序8-12 linux/kernel/panic.c


  1 /*

  2  *  linux/kernel/panic.c

  3  *

  4  *  (C) 1991  Linus Torvalds

  5  */

  6

  7 /*

  8  * This function is used through-out the kernel (includeinh mm and fs)

  9  * to indicate a major problem.

 10  */

    /*

     * 该函数在整个内核中使用(包括在 头文件*.h, 内存管理程序mm和文件系统fs中),

     * 用以指出主要的出错问题。

     */

 11 #include <linux/kernel.h> // 内核头文件。含有一些内核常用函数的原形定义。

 12 #include <linux/sched.h>  // 调度程序头文件,定义了任务结构task_struct、初始任务0的数据,

                              // 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。

 13

 14 void sys_sync(void);    /* it's really int */ /* 实际上是整型int (fs/buffer.c,44) */

 15

    // 该函数用来显示内核中出现的重大错误信息,并运行文件系统同步函数,然后进入死循环--死机。

    // 如果当前进程是任务0的话,还说明是交换任务出错,并且还没有运行文件系统同步函数。

    // 函数名前的关键字volatile用于告诉编译器gcc该函数不会返回。这样可让gcc产生更好一些的

    // 代码,更重要的是使用这个关键字可以避免产生某些(未初始化变量的)假警告信息。

    // 等同于现在gcc的函数属性说明:void panic(const char *s) __attribute__ ((noreturn));

 16 volatile void panic(const char * s)

 17 {

 18         printk("Kernel panic: %s\n\r",s);

 19         if (current == task[0])

 20                 printk("In swapper task - not syncing\n\r");

 21         else

 22                 sys_sync();

 23         for(;;);

 24 }

 25