第 72 环 · 单名问候也验归属(恢复那场不叫错名字)
第 71 环给「念清单」补上了归属校验:清单里每个名字,先读 0x280 + 槽,与条目的 sid 对上才念。可开机还有另一条入口——单名问候:all_names=0、只恢复一场时,boot_greet 直接按槽读名字格,照第 57 环的老契约拼「<名字>,接着聊吧。」。
这条入口同样会踩槽复用的坑:恢复的那一场住进的槽,格子里可能还留着上一任的名字。第 71 环修的是「清单」,这一环修「单名」——同一个洞,两条入口都要堵。
单名路径先验归属,再读名字。start 那拍不再直接发名字格地址,而是先发一拍同步读 OWNER_BASE + slot(0x280 + 输入槽号),并用 single_r 记住这次走单名路。收到归属后与这次恢复的 sid 比对:
sbind=1 / nver=1;named=0 / sbind=0 / nskip=1;all_names=1 的念清单老路一字未改,仍按第 71 环逐条验归属。接口与一个旧探针撞名的修正。新增只读探针 BG_SBIND(0xE7C):低 1 位=对上,高 16 位=读到的归属。顺带发现第 71 环把 BG_NSKIP 放在 0xE70,可 0xE70 从第 58 环起就是 SCREEN34,读回一直被后者盖住——本环把 BG_NSKIP 挪到 0xE78,0xE70 仍归 SCREEN34;第 71 环的 ISA 程序同步改读 0xE78。屏摘要新增 SCREEN48(0xAE8):skip<<20 | ver<<16 | sbind<<15 | named<<14 | bytes。前 71 圈地址映射一字不改,ISA 一位没动(仍 npu.boot)。
单元仿真 tb_boot_greet72(真同步 SRAM 行为模型):
0xA3,恢复 sid=0xA3 →「查资料,接着聊吧。」48 字节 / 12 字逐位,sbind=1 / nver=1 / nskip=0;0xAA → 退回「你有三场没聊完。」24 字节 / 6 字,sbind=0 / nskip=1,「查资料」三个字一个都不出现;sid=0 遇残留归属 → 同样退回按场数,不继承旧名字;all_names=1 老路回归:三场里一场归属不符 → 仍念「记一笔、家里的事,还有一场。」ver=2 / skip=1;clear 后 sbind / sowner / nver / nskip 一并归零。ISA 协同仿真 tb_isa_greet72(真整颗 SoC):目录三场 0xA1(slot0) / 0xA2(slot1) / 0xA3(slot2),最后一场 0xA3;slot2 名字格写着「查资料」,但归属表 0x282 被改成 0xAA(槽复用残留)。开机前 BG_ALL=0,一条 npu.boot 跑完恢复、单名问候:
0x1E0 =「你有三场没聊完。」24 字节 / 6 字逐位相同;BG_NAMED=0 / BG_NVER=0 / BG_NSKIP=1 / BG_SBIND=0 / BG_SOWNER=0x00AA / BG_BYTES=24,全由硬件自报;SCREEN48 = 0x00100018(skip 1 | ver 0 | sbind 0 | named 0 | bytes 24),SCREEN=0x72;一次 npu.wait 没冻死。回归:tb_boot_greet(第 53 环按场数)、tb_boot_greet58(第 58 环念清单,单名用例补上归属)、tb_boot_greet71(单名用例的 nver 断言更新为 1)、tb_boot_greet72、tb_isa_greet71(改读 0xE78)、tb_min_soc64 全 RESULT=PASS;主通路 SCREEN=0xF905FD04 与第 25~71 环逐位一致。
只有一个对话窗口的手机,开机第一句话就是它唯一的人味。记得住几场还不够,得叫对人;名字不是这一场的,就宁可少叫一个,也不把别人的名字塞进这一场。
软硬协同的分寸也在这里:名字在内存里,归属在内存里,比对在硬件里;核不查表、不比对、不拼字,开机那一条 npu.boot 就把该叫的名字叫准了。
单名问候带余场。「查资料,接着聊吧。」说得出一场,却没说另外两场还在等。下一环让单名问候在名字验过之后,按活清单总数补一句「还有 N 场在等你」,让开机第一句既叫对人,也交代清楚今天还有几场没聊完。