从操作系统内核解释电脑死机原理

2021年9月17日 25点热度 0条评论 来源: i为伱而搁浅

关于电脑死机的原因或者说原理,即电脑为什么会死机,电脑死机时计算机底层都发生了什么。一直不太明白,在网上也查过相关的资料,但是都没有找到自己想要的。网上谈的都是外部导致电脑死机的原因,比如内存条坏了、散热不良、硬盘故障、应用软件不兼容,但我觉得这些都太抽象,没有分析透彻。没有从根本上解释死机、蓝屏的原因。

   最近在学习Linux内核,自从大一的时候读了一本《计算机的心智---操作系统之哲学原理》,就都对操作系统感兴趣。大一的时候也读过许多操作系统原理的书,因为讲的都是抽象的原理,所以感觉操作系统很神秘。现在大二了,开始了系统内核源代码的学习,感觉我想知道的,都可以在这里发掘。Linus说过,要想理解一个系统的运行机制,最好的方法就是去读源代码。我觉得很对,以前读的都是原理性的书籍,所以感觉操作系统很神秘,但现在遨游在系统内核源代码中的时候,反而不觉得他有多神秘了,而是觉得,真是博大精深!

   好了,现在就让我说说我从Linux内核代码中找到的系统死机的原因吧。

电脑死机也就是系统死机了,在windows下的表现就是蓝屏。系统死机的本质是系统遇到了无法处理的错误、故障或异常,然后系统内核会去执行一个空死循环!CPU会一直在那里执行,从而无法响应鼠标、键盘的输入,用户程序也不会再得到CPU的执行。

一下是Linux内核代码中的死机函数panic

volatile void panic(const char * s)

{

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

if (current == task[0])

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

else

sys_sync();

for(;;);

}

    panic()函数直接导致系统进入死机状态。可以看到系统首先会打印出错信息,最后执行for(;;);空死循环!

    内核程序中经常会见到调用panic函数使计算机进入死机状态的函数,比如下面这个内核函数中就出现了三次:

int new_block(int dev)

{

struct buffer_head * bh;

struct super_block * sb;

int i,j;

 

if (!(sb = get_super(dev)))

panic("trying to get new block from nonexistant device");

j = 8192;

for (i=0 ; i<8 ; i++)

if (bh=sb->s_zmap[i])

if ((j=find_first_zero(bh->b_data))<8192)

break;

if (i>=8 || !bh || j>=8192)

return 0;

if (set_bit(j,bh->b_data))

panic("new_block: bit already set");

bh->b_dirt = 1;

j += i*8192 + sb->s_firstdatazone-1;

if (j >= sb->s_nzones)

return 0;

if (!(bh=getblk(dev,j)))

panic("new_block: cannot get block");

if (bh->b_count != 1)

panic("new block: count is != 1");

clear_block(bh->b_data);

bh->b_uptodate = 1;

bh->b_dirt = 1;

brelse(bh);

return j;

}

    当尝试从一个不存在的设备申请一块内存,或申请到的内存是已标记的,或者申请内存失败,都会进入死机状态。也许因为这是系统内核吧,要进行严格的审查,不容一点漏洞。也许是一处出错了也代表着其他地方也出现了错误,所以选择了死机。

    电脑死机时为什么不会再响应用户程序?因为我们电脑上的各种程序如QQ、酷狗、浏览器等进程都是由操作系统进行调度,分配CPU执行时间的。我们的用户程序可以执行for(;;);这种处于用户态的程序的空死循环不会导致系统的死机,因为我们的进程都是在系统的调度下运行的,但是系统本身就不同了。在系统内核里除死机外决不可执行死循环,因为这样的话,系统调度进程的函数也就根本无法得到执行的机会,还有中断也不会有反应,所以电脑死机时我们的应用程序就不会正常运转了。

    也许你会问,为什么系统死机时要这样呢?为什么不执行重启,为什么不去终止导致系统错误的程序。这样当然可以了,但是,这样做不好。因为系统内核已经出错了,而且这种错误是系统无法处理、无法恢复的,既然已经出错了,那么如果让系统再运行下去的话,可能会再导致更多、更严重的错误,就是错上加错了。可能会损坏硬盘数据等等。所以系统进行了权衡取舍,最后选择了死机这种方式,就是让CPU空死循环,防止错上加错,导致不可预知的严重损失。

    原文作者:i为伱而搁浅
    原文地址: https://blog.csdn.net/u014292052/article/details/21831483
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。