主要观点:
- 遇到 PS2SDK 相关问题,如加载 PS2SDK ELF 后软重置会导致 TLB 缺失(崩溃),问题源于libcglue 时区启动代码,提供空的存根可解决。
- 几个月后,有人称 ps2link 重置后图形损坏,经调查发现帧缓冲区和 z 缓冲区指向同一页面地址 0xFFFFFFFF,libgraphs 的 vram 分配器简单线性导致,推荐在开始第一次分配前调用 graph_vram_clear()。
- 为解决时区问题,追踪导致 TLB 缺失的指令无果,从
_libcglue_timezone_update()
开始深入 newlib,发现静态局部变量alloced
的问题,通过测试验证全局变量和静态局部变量的初始化情况,最终发现__start 例程中处理清零.bss 段的整个汇编部分是注释,添加换行符和修复格式后解决了全局变量和时区问题,相关 pull 请求可查看这里。
关键信息:
- PS2SDK 问题及解决方法:加载 ELF 后软重置导致 TLB 缺失,libcglue 时区代码问题及空存根解决,ps2link 重置后图形损坏及 vram 分配器问题及解决办法。
- newlib 中的
_setenv_r
函数及静态局部变量alloced
。 - __start 例程中汇编代码的错误及修复,添加换行符使 bss 段清零正常。
重要细节:
- 具体的代码示例,如
void _libcglue_timezone_update(){}
和int main() { // do your fun PS2 stuff here, just don't use any timezone stuff }
等。 - 图形损坏时的现象描述及相关图像

。 - 各种调试过程中的输出信息,如
> mips64r5900el-ps2-elf-objdump -x playground.elf | grep variable
和> mips64r5900el-ps2-elf-objdump -d playground.elf | grep start
等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。