第669章 思想的钢印!_四合院开局四八,八岁带妹逃荒 首页

字体:      护眼 关灯

上一章 目录 下一章

第669章 思想的钢印!

第(2/3)页

个系统,从头到尾,都共享着那块由系统在启动时分配好的,唯一的堆栈内存。

所以,当他们设计“天枢”内核时,尽管他们天才般地想到了要为每个任务保存寄存器、程序计数器等“上下文”。

但他们,却完完全全,彻彻底底地,忽略了最重要的一样东西!

堆栈!

每个任务,都应该有自己独立的,互不干扰的堆栈空间!

而他们做了什么?

他们让任务A和任务B,共用了同一个堆栈!

黄建功的脑海中,瞬间浮现出灾难发生的全过程。

1.  系统启动,分配了一个全局堆栈。

2.  任务A开始运行,它调用了一些函数,在堆栈里压入了一些自己的数据,比如局部变量、返回地址。

3.  任务A调用`system_yield()`,触发任务切换。

4.  “天枢”内核执行,将任务A的寄存器(包括那个指向公共堆栈的SP指针)保存到任务A的PCB里。

5.  内核切换到任务B。

6.  任务B开始运行。它也调用了函数,它也需要在堆栈里压入数据。但是!它使用的,是和任务A完全相同的那个堆栈!

7.  于是,任务B的数据,就把任务A之前存放在堆栈里的数据,给覆盖了!冲掉了!

灾难,在这一刻就已经注定。

8.  任务B运行了一会儿,也调用了`system_yield()`。

9.  内核再次切换,轮到任务A运行。

10.  内核从任务A的PCB里,恢复了任务A所有的寄存器,包括那个SP指针。

11.  任务A从上次暂停的地方继续执行。它准备从堆栈里弹出自己之前存入的返回地址,准备返回上一个函数。

12.  但是,它满心欢喜地去堆栈里取数据时,却发现,那个位置的数据,早已不是它当初存放的返回地址,而是被任务B写入的一堆乱七八糟的垃圾数据!

当CPU试图将这串垃圾数据当作一个地址,进行跳转时……

“内核恐慌”,爆发了。

CPU发现这个地址根本不对劲,是个无效地址,它不知道该跳到哪里去。这种最底层的、无法挽救的错误,直接触发了硬件层面的保护机制,整个系统崩溃,报告“无效堆栈指针”。

“噗通。”

黄建功一屁股坐在了地上。

他的眼神空洞,冷汗顺着额角,一滴一滴地落在地上。

不是代码写错了。

不是硬件有问题。

是他们的思想,从根子上就错了。

他们以为给每个任务发了一件“外衣”(PCB),就能让它们分清彼此。

他们却忘了,这些任务,还光着脚,踩在同一片泥地(堆栈)里,互相踩踏,把彼此弄得满身是泥,最终一起摔倒。

“原来是这样……”

“原来是这样……”

实验室里,听懂了钱学敏解释的专家们,一个个都露出了恍然大悟,继而痛苦万分的神情。

这个错误,太低级了。

低级到让他们感到羞辱。

他们这

(本章未完,请翻页)
记住手机版网址:m.lewenwx.cc
加入书签我的书架

上一章 目录 下一章