Round 32: the api header is byte-identical to the firmware's, and the font-read inference is suspect

The working copy's app_api.h and the firmware's own (fetched from armel/uv-k1-k5v3-firmware-custom) are the same 14403 bytes with the same sha256, so the layout theory of round 31 is withdrawn; the assembly confirms the calls land on print_tiny at offset 28 and display_clear at 8 as expected.

The measurement those conclusions rested on is now in doubt: 1446 font-region reads early in the session look like the font being cached in RAM, in which case print_tiny never touches the external flash and 'no font read' says nothing about whether draw() ran. The next oracle must be panel-only, and the sharpest unexplained contrast is that the same fill-and-blit lights the panel from a 320-byte app and not from the first statement of this one.
This commit is contained in:
mckero committed 2026-10-02 12:17:34 +08:00
1 parent d3fcff7ac3
commit 4c842e7b32
2 files changed
+35

No files matched your search

+19
View File
@@ -1151,6 +1151,25 @@ Breakout, Cube3D, Beam), every field lines up -- entry_off 0, flags 0x0001 for B
name at offset 20, version at 36, link_vma 0x20000280 byte-for-byte identical -- so pack_app.py is right and
the refusal theory is dead. The entry point: the assembly listing's first function is app_main, its prologue
push.w {r4-r11, lr} matches the blob's first bytes f0 b5 exactly, and the linker script pins .text.entry to
**Round 32: the header is byte-identical to the firmware's own, and the font-read inference is suspect.**
The working copy's app_api.h and the firmware's own, fetched from armel/uv-k1-k5v3-firmware-custom over
HTTPS, are the same 14403 bytes with the same sha256 -- so round 31's prime suspect, that the app was
compiled against a different layout, is wrong and is withdrawn. Reading the offsets back out of the
assembly confirms the calls are right as well: the member at offset 28 is print_tiny and the one at 8 is
display_clear, exactly where this app's source expects them.
That leaves the measurement those conclusions rested on in doubt. The claim was that draw() is never
reached because the flash probe records no font read after the app's code load. But the session shows
1446 reads of the font region early on, which is what caching the font in RAM looks like -- and if the
font is cached, print_tiny never touches the external flash at all, so "no font read" says nothing about
whether draw() ran. The instrument, not the app, is what was measured.
So the next oracle has to be one that cannot be confused this way: something visible in the panel and in
nothing else. The sharpest unexplained fact is still that fill-every-byte-and-blit as the app's very first
statement leaves the panel untouched, while the same act from a 320-byte app lights it; that contrast needs
re-measuring with the app doing nothing else at all, and with the panel read before and after in one run.
offset 0. And the acceptance: the firmware answers status 0 for the app over 0x0730.
What is left is sharper than anything so far. The listing shows the app doing exactly what it was written to
+16
View File
@@ -906,6 +906,22 @@ MENU 之后**一秒内**面板就落到 **43**(启动器的框)并停在那
`push.w {r4-r11, lr}` 与 blob 开头 `f0 b5` 完全一致,而链接脚本把 `.text.entry` 钉在偏移 0。**接受**:固件对
`0x0730` 回答 `status 0`。
**第 32 轮:头文件与固件自己的那份逐字节相同,而「字库读取」这条判据本身可疑。**
把固件自己的 `app_api.h`(从 `armel/uv-k1-k5v3-firmware-custom` 经 HTTPS 取回 ✓)与本仓库这份对比:同样是
**14403 字节、同样的 sha256** —— 所以第 31 轮的首要嫌疑「应用是按另一份布局编译的」是**错的**,撤回。
从汇编清单反读偏移也确认调用是对的:偏移 28 上的成员是 `print_tiny`、偏移 8 上的是 `display_clear`,
正是这份源码期待的位置。
于是支撑那些结论的**测量本身**变得可疑。当时的说法是「blob 加载之后没有任何字库读取 ⇒ `draw()` 从未被到达」。
但整个会话里早期有 **1446 次字库区读取** —— 那正是**把字库缓存进 RAM** 的样子;而**如果字库被缓存了**,
`print_tiny` 就**根本不需要碰外部 flash** ✓ —— 那么「没有字库读取」对「`draw()` 有没有跑过」**什么也说明不了**。
被量到的是**仪器**,不是应用。
所以下一个判据必须是**不可能这样被混淆**的那种:只体现在面板上、别处看不见的东西。目前最锋利、仍未解释的事实依旧是:
**把应用的第一条语句写成「填满每个字节再 blit」,面板纹丝不动**;而一个 320 字节的应用做同一件事却能点亮它。
这个对照需要用「应用除此之外什么都不做」重测一次,并在**同一次运行**里读前后两次面板。
剩下的事实比此前任何一次都锋利。清单显示应用**确实按写的那样在做**:装载 `A`、取 api 里偏移 28 的成员、调用它
(第一条 `print_tiny`)、然后内联展开 `new_game()`、进入主循环,而那个自旋正是 PC 直方图里最热的偏移。**应用在跑** ——
417800 个样本落在叠加区内,集中在 0x18/0x8a/0x8c/0x9c/0xae,也就是它自己的前 180 字节。**而偏移 8 与 28 上的调用**