内联汇编的危险

主要观点:

  • 遇到 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 }等。
  • 图形损坏时的现象描述及相关图像![An image of a CRT TV with blue and black horizontal stripes.](https://fobes.dev/assets/broken_graphics_iad.jpg)
  • 各种调试过程中的输出信息,如> mips64r5900el-ps2-elf-objdump -x playground.elf | grep variable> mips64r5900el-ps2-elf-objdump -d playground.elf | grep start等。
阅读 9
0 条评论