我正在为Mac OS X编写Mac OS 9“兼容性层”,因为最近我怀旧,并且由于所有当前解决方案都要求您在虚拟机中运行Classic,而该虚拟机不支持它应运行的所有功能。我想用的东西。
为了实现该目标,我实现了PEF可执行加载器,可以桥接到本机代码的PowerPC解释器以及一些Mac OS 9库。整个过程都是正常的:解释器中有一些错误,但这是预料之中的,我正在研究中。
到目前为止,我最大的问题是PowerPC程序是32位的,所以指针必须是32位的。为了满足该约束,当前我仅针对i386进行编译。但是,当我尝试围绕该内核构建时,它变得越来越受约束(例如,不能将ARC与32位Cocoa应用程序一起使用)。更不用说让PowerPC代码访问主机进程可以执行的所有操作也不是超级安全。
我在设计“平台”时考虑到最终会切换到64位:解释器期望一个基地址,并且所有PowerPC指针都被该基地址偏移。 (出于性能和设计的原因,毫无疑问具有将PowerPC地址转换为本地地址的映射。)
由于64位地址空间有足够的空间容纳40亿个独立的32位地址空间,所以这对我来说似乎是个好方法。
但是我仍然有一个问题:我需要确保能够在该地址范围内分配内存,因为PPC解释器将无法访问该地址范围之外的任何内容。
我现在正在考虑两种解决方案:
mmap
,但是mmap
会要求以页面倍数分配,这对我来说似乎很浪费,因为无论分配多么小,我都需要一个完整的页面(尽管实际上考虑到与现代计算机相比,Classic时代的Mac具有很少的内存,请不要担心;mmap
与PROT_NONE
保留完整的0x100000000字节,然后按需在mprotect
页上实际分配内存,并在不再有用时将它们放回PROT_NONE
。在纸上看起来不错,但这意味着我必须实现malloc
替换。所以,我该怎么办?是否有内置机制可以让我尝试在特定地址范围内分配malloc
样式的内存?否则,是否有我可以基于的良好,可读且开放源代码的malloc
实现?