书吧达 > 四合院开局四八,八岁带妹逃荒 > 第668章 致命的错误!

第668章 致命的错误!


“编译链接准备!”

随着黄建功一声令下,整个实验室的气氛瞬间被点燃。

如果说之前黄建功徒手编写机器码是神乎其技的个人表演,那么现在,就进入了检验成果的团队协作阶段。

“‘鲁班神斧’编译器小组就位!”

“‘华夏神文’链接器小组就位!”

“‘盘古之心’烧录接口准备完毕!”

一道道指令在实验室中回响,专家们迅速行动起来,各就各位。

他们要做的,是一件听起来有些绕的事情。

黄建功编写的,是“天枢”内核最底层的机器码。但这些代码,是以文本文件的形式,保存在一台辅助计算机上的。

他们需要用之前开发的“鲁班神斧”工具链,将这些二进制文本,转换成“盘古之心”能够直接执行的二进制文件格式。

这个过程,被称为“编译和链接”。

虽然黄建功写的就是机器码,理论上不需要“编译”,但“链接”这一步至关重要。它需要将`task_create()`和`task_yield()`这两个独立的函数,以及未来会编写的更多函数,按照正确的内存地址,组织在一起,形成一个完整的程序。

“开始编译!”

操作员敲下回车。

辅助计算机的风扇开始呼啸,“鲁班神斧”的核心程序开始运行。

它读取着黄建功耗费十几个小时心血写下的二进制代码文本,将其解析,并转换为标准的“盘古可执行文件”格式。

屏幕上,进度条在缓慢地滚动。

所有人都紧张地盯着屏幕。

“编译通过!未发现语法错误!”

“开始链接……”

“正在分配内存地址……”

“`task_create`函数入口地址:0x00001000。”

“`task_yield`函数入口地址:0x00001C80。”

“链接完成!生成可执行文件‘tianshu_kernel.pke’!”

“成功了!”实验室里爆发出第一阵欢呼。

这意味着,黄建功手写的上千行二进制代码,在“语法”层面,是完全正确的!这本身就是一个奇迹!

黄建功的脸上,也露出了一丝笑容。这至少证明,他十几个小时的奋战,没有出现低级的拼写错误。

“下一步,烧录!”他的声音沉稳有力。

“是!”

操作员通过一条特制的数据线,将辅助计算机与“盘古之心”的主板连接起来。

“启动烧录程序!”

“目标:‘盘古之心’ROM存储区。”

“开始传输‘tianshu_kernel.pke’……”

数据流通过线缆,涌入那块承载着整个华夏未来的芯片之中。

这个过程,就好像将刚刚塑造好的“灵魂”,注入那具早已准备好的“躯体”。

一分钟后。

“烧录完成!校验通过!”

聂老总一直站在旁边,此刻也忍不住握紧了拳头。

最关键的时刻,要来了。

他们要运行这个初生的“内核”,看它是否能像设计的那样,实现两个任务的切换。

“建功,测试方案是什么?”聂老总问道。

黄建功指着另一块屏幕,上面是用“华夏神文”编写的两段极简的测试代码。

“老总,我们准备了两个最简单的任务。”

“任务A,是一个死循环,它会不停地在屏幕上打印字符‘A’。”

“任务B,也是一个死循环,它会不停地打印字符‘B’。”

他解释道:“在没有‘天枢’内核之前,如果我们先运行任务A,那么整个系统就会被任务A占死,屏幕上会永远是‘AAAAA……’,任务B永远没有机会运行。这就是我们之前遇到的‘死循环’。”

“但是现在,”黄建-功的眼中闪烁着自信的光芒,“我们在任务A和任务B的循环体内部,都加入了一行特殊的代码:`system_yield()`。这个函数,会主动调用我们刚刚烧录进去的`task_yield()`内核函数。”

“我们的预期是,当任务A打印一个‘A’之后,就会主动放弃CPU,让内核把控制权交给任务B。任务B打印一个‘B’之后,也主动放弃CPU,再把控制权交还给任务A。”

“所以,如果‘天枢’内核工作正常,我们在屏幕上看到的,将不再是‘AAAAA……’或者‘BBBBB……’,而是……”

“‘ABABABAB……’!”钱学敏替他说了出来,声音里充满了期待。

所有人都明白了。

这个简单的“ABAB”交替打印,背后代表的,是操作系统历史上最伟大的一步:协同式多任务!

它意味着,“盘古之心”将不再是一个一次只能干一件事的笨蛋,而是一个懂得“分享”和“协作”的,拥有初步智能的生命体!

“准备测试!”黄建功深吸一口气,下达了最后的命令。

他亲自操作,先调用了两次`task_create()`,在“天枢”内核中,创建了任务A和任务B。

然后,他敲下了启动指令。

“运行任务A!”

回车键按下。

整个实验室,死一般的寂静。

所有人的心脏,都提到了嗓子眼。

屏幕上,光标闪烁。

下一秒。

一个清晰的,绿色的字符,出现在屏幕左上角。

A

成功了!任务A成功运行了!

还没等众人欢呼,就在那个“A”出现的瞬间,黄建功编写的`system_yield()`被触发。

CPU的控制权,从任务A,跳转到了那段刚刚烧录进去的,神秘而伟大的“天枢”内核代码中!

内核代码开始执行。

它保存任务A的现场,将任务A的状态从“运行”改为“就绪”。

然后,它在任务队列里,找到了下一个等待运行的任务——任务B。

它加载任务B的现场,将任务B的状态从“就绪”改为“运行”。

最后,它一个跳转,将CPU的控制权,交给了任务B!

整个过程,发生在电光火石之间,肉眼完全无法察觉。

在所有人看来,就是那个“A”字刚刚出现……

紧接着,在“A”的旁边,又跳出了一个字符。

B

“成功了!”

“是B!是B!任务切换成功了!”

孙立国第一个尖叫起来,他激动地跳了起来,一把抱住了身边的同事。

实验室瞬间变成了欢乐的海洋!

“ABABAB……”

屏幕上,A和B两个字符,正在完美地,以一比一的频率,交替出现,向整个世界宣告着一个新纪元的到来!

这不再是“Hello,  World!”那样的简单问候。

这是灵魂的第一次心跳!是生命的第一声啼哭!

聂老总看着那串不断延伸的“ABAB”,眼眶湿润了。他仿佛看到的不是两个单调的字符,而是两个不知疲倦的精灵,在屏幕上欢快地舞蹈。

黄建功和钱学敏对视一眼,都从对方的眼中,看到了巨大的喜悦和如释重负。

他们成功了!

他们用最原始的办法,徒手创造出了操作系统的雏形!

然而,就在所有人都沉浸在巨大的喜悦中时。

那串“ABAB”的舞蹈,仅仅持续了不到十秒钟。

突然!

“嗡——”

一声尖锐刺耳的蜂鸣,再次响彻实验室。

屏幕上那串欢快跳动的“ABAB”,戛然而止。

整个屏幕,变成了一片死寂的红色。

在屏幕的最中央,一行白色的,如同魔鬼判词般的文字,缓缓浮现。

【FATAL  ERROR:  KERNEL  PANIC  -  INVALID  STACK  POINTER】

【致命错误:内核恐慌  -  无效堆栈指针】

狂喜的气氛,在0.1秒内,瞬间凝固。

所有人的笑容,都僵在了脸上。

他们脸上的血色,以肉眼可见的速度褪去,变得比纸还要苍白。

“内核……恐慌?”

一个年轻的研究员,用梦呓般的声音,念出了那个他从未见过的,却让他灵魂都在战栗的词汇。

Kernel  Panic。

如果说之前的“死循环”,是应用程序层面的错误,是“车”的问题。

那么“内核恐慌”,就是操作系统核心层面的,毁灭性的崩溃。

是“交通警察”自己,脑溢血了!

黄建功猛地从椅子上弹了起来,他不敢相信自己的眼睛。

他冲到屏幕前,死死地盯着那行错误信息。

“无效堆栈指针……”

他的大脑一片空白。

怎么可能?

堆栈指针(SP),是CPU中最重要的寄存器之一,它指向内存中的“堆栈”区域,用来临时存放函数调用的地址、参数,以及他们刚刚实现的“上下文”信息。

`task_yield()`函数的核心,就是围绕着这个堆栈指针来操作的。

他确信,自己保存和恢复上下文的每一个步骤,都经过了上百次的推演,不可能出错!

为什么会无效?

“重启!马上重启!记录所有日志!”黄建功的声音嘶哑,带着一丝他自己都未察觉的颤抖。

系统被重启。

测试再次进行。

屏幕上,再次出现了那串可爱的“ABABAB……”

这一次,它坚持了十二秒。

然后。

“嗡——”

同样的蜂鸣,同样的红屏,同样的致命错误。

【FATAL  ERROR:  KERNEL  PANIC  -  INVALID  STACK  POINTER】

绝望。

一种比之前遇到“死循环”时,更加深邃,更加冰冷的绝望,瞬间攫住了每一个人的心脏。

他们刚刚爬出深渊,看到了万丈光芒。

却在下一秒,被一只无形的大手,以更快的速度,重新拽回了更深的地狱。

而且,是以一种他们完全无法理解的方式。

“问题……到底出在哪里?”

黄建功看着那片刺目的红色,喃喃自语。

他的自信,在“内核恐慌”这四个字面前,被击得粉碎。


  (https://www.shubada.com/105253/39606227.html)


1秒记住书吧达:www.shubada.com。手机版阅读网址:m.shubada.com