字体
关灯
   存书签 书架管理 返回目录
    刺目的红光,将实验室里每一个人的脸都映照得如同鬼魅。
    空气凝固了。
    刚刚还因“ABAB”的交替出现而沸腾的喜悦,被这突如其来的“内核恐慌”彻底浇灭,连一丝余温都没有剩下。
    如果说之前的“死循环”是陷入泥潭,至少还能看到岸边。
    那么此刻的“内核恐慌”,就好像脚下的地面突然消失,整个人坠入了无尽的虚空,连挣扎的方向都找不到。
    “不可能……绝对不可能……”
    黄建功失神地喃喃自语,他无法接受这个结果。
    他的大脑在疯狂运转,一遍又一遍地回放着`task_yield`函数的每一行机器码。
    `PUSH {R0-R15, LR}` - 保存所有寄存器到当前堆栈。
    `MOV R0, SP` - 获取当前的堆栈指针。
    `LDR R1, =current_task_pcb` - 加载当前任务PCB的地址。
    `STR R0, [R1, #4]` - 将堆栈指针的值,保存到PCB的特定偏移位置(比如偏移4个字节处)。
    ……
    `LDR R1, =next_task_pcb` - 加载下一个任务PCB的地址。
    `LDR R0, [R1, #4]` - 从下一个任务的PCB中,读取它上次保存的堆栈指针。
    `MOV SP, R0` - 恢复堆栈指针!
    `POP {R0-R15, PC}` - 弹出所有寄存器,并跳转到新任务。
    逻辑天衣无缝!
    每一个步骤都完美地实现了“上下文切换”的理论!
    他确信,自己保存了任务A的堆栈指针,并且在切换到任务B之前,正确地恢复了任务B的堆栈指针。
    为什么系统会报告“无效堆半指针”?
    难道是……
    一个可怕的念头,在黄建功的脑海中闪过。
    “快!”他猛地回头,对着硬件组的周老吼道,“周老!查一下‘盘古之心’的硬件手册!关于堆栈指针SP,有没有什么我们不知道的特性!”
    周老也是满头大汗,他立刻带着人,冲到另一边堆满资料的桌子前,翻箱倒柜地找了起来。
    钱学敏也强迫自己从震惊中冷静下来,她走到黄建功身边,声音干涩地问道:“建功,有没有可能……是两个任务,用了同一个堆栈?”


关闭+畅/阅读=模式,看最新完整内容。本章未完,请点击下一页继续阅读》》
上一章 目录 下一页