🎯 圆心 · 目标(每环都从这里出发)
造一台 Salt OS 手机:基于 DeepSeek 的 AI 操作系统,iPhone 4S 外形(含底部圆形 Home 键),开机只有一个 AI(无桌面、无图标),软硬协同设计(OS + 芯片 + 主板一起做),为别人搭台、让别人在平台上赚钱。

🧭 完整框架(同心圆)

①文字闭环 · ②技术深入 · ③挂SRAM · ④权重INT4 · ⑤激活INT4 · ⑥NPU.STORE · ⑦KV Cache · ⑧注意力QK^T · ⑨Softmax · ⑩加权V · ⑪前馈FFN · ⑫残差·LayerNorm · ⑬多层堆叠 · ⑭QKV投影 · ⑮K/V分离 · ⑯自回归解码 · ⑰连续生成 · ⑱采样 · ⑲KV环形缓冲 · ⑳滑窗注意力 · ㉑多头注意力 · ㉒输出投影 W_o · ㉓多头块入残差流 · ㉔多头块进解码循环 · ㉕整层一块 · ㉖整网一块 · ㉗ISA契约 · ㉘权重内存化 · ㉙权重预取双缓冲 · ㉚权重分块 · ㉛矩阵行块 · ㉜行块自增 · ㉝起始块号可编程 · ㉞段表连扫 · ㉟段表流式取 · ㊱行块矩阵扫 ISA 化 · ㊲描述符链 · ㊳链槽直喂 · ㊴主路走链 · ㊵链预投下层 · ㊶跨趟预投 · ㊷权重池三 bank · ㊸权重池 ISA 化 · ㊹一步生成 ISA 化 · ㊺整段生成 ISA 化 · ㊻对话回路 · ㊼对话 ISA 化 · ㊽会话记忆归档 · ㊾多会话槽位 · ㊿会话槽位 ISA 化 · 51 开机续聊 · 52 会话清单 · 53 开机用上清单 · 54 问候接话 · 55 删掉一场 · 56 会话改名 · 57 名字进问候 · 58 问候念清单 · 59 按名字接话 · 60 叫错名字也回一句 · 61 反问给选项 · 62 按序号点选 · 63 序号用于删除 · 64 删除回执念名字 · 65 删除可撤回 · 66 撤回回执念名字 · 67 撤回即续聊 · 68 续聊先开口 · 69 开口带名字 · 70 开口不叫错人 · 71 开机问候也认人 · 72 单名问候也验归属 → 73 单名问候带余场

本环:恢复的那一场,也不许叫旧名字

① 目标(这一环要解决什么)

第 71 环给「念清单」补上了归属校验:清单里每个名字,先读 0x280 + 槽,与条目的 sid 对上才念。可开机还有另一条入口——单名问候:all_names=0、只恢复一场时,boot_greet 直接按槽读名字格,照第 57 环的老契约拼「<名字>,接着聊吧。」。

这条入口同样会踩槽复用的坑:恢复的那一场住进的槽,格子里可能还留着上一任的名字。第 71 环修的是「清单」,这一环修「单名」——同一个洞,两条入口都要堵。

② 实现(做了什么)

单名路径先验归属,再读名字。start 那拍不再直接发名字格地址,而是先发一拍同步读 OWNER_BASE + slot(0x280 + 输入槽号),并用 single_r 记住这次走单名路。收到归属后与这次恢复的 sid 比对:

  • 归属 == sid:这个名字是这一场的 → 继续读 6 字名字格,照第 57 环拼 48 字节 / 12 字,sbind=1 / nver=1;
  • 归属 != sid:旧名字,连名字格都不读 → 退回第 53 环「你有三场没聊完。」24 字节 / 6 字,named=0 / sbind=0 / nskip=1;
  • sid=0(新开一场)不可能等于任何归属 → 天然不继承旧名字,不叫错人;
  • 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 行为模型):

  • 槽 2「查资料」归属 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 没冻死。
RESULT=PASS
槽 2 归属 0xAA ≠ 恢复的 0xA3 → 开机第一句不叫「查资料」

回归: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 就把该叫的名字叫准了。