对 SBCL 内部的探索

主要观点:介绍 SBCL(Common Lisp 实现)的内部结构,通过实例和工具来探索 Lisp 对象在内存中的表示、实际编译的 Lisp 代码位置、特殊变量绑定等问题,同时假设读者熟悉 Lisp 和 x86 汇编,且已安装 SBCL。
关键信息

  • (disassemble 'testfunc)可查看函数testfunc的反汇编代码,能了解参数传递和操作过程。
  • 通过修改反汇编代码中的字节值,如将0x42改为0x50,可改变testfunc的返回值。
  • sb-kernel:get-lisp-obj-address可获取 Lisp 对象的地址,但不建议在生产环境中使用。
  • Lisp 对象在内存中是“标记指针”形式,用最后几位表示类型,其余为实际指针。
  • 如字符串在内存中以特定方式存储,可通过工具修改其内容。
  • src/runtime/genesis/constants.h文件描述了 SBCL 运行时中 Lisp 对象的布局。
    重要细节
  • testfuncMOV EDI, 66表明参数通过GENERIC-+处理,且修改字节值可改变结果。
  • 反汇编代码中的地址和内存操作细节,如[RIP-122]等。
  • 关于不同类型对象的标记和存储方式,如数字、函数指针、列表指针等。
  • 对各种工具的使用示例,如hexdump-address函数用于转储内存内容。
阅读 6
0 条评论