我如何要求Mac OS在特定的地址范围内分配内存?

问题描述 投票:12回答:2

我正在为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解释器将无法访问该地址范围之外的任何内容。

我现在正在考虑两种解决方案:

  • 找出我是否可以要求Mac OS在特定地址范围内分配某些内容。我知道我可以使用mmap,但是mmap会要求以页面倍数分配,这对我来说似乎很浪费,因为无论分配多么小,我都需要一个完整的页面(尽管实际上考虑到与现代计算机相比,Classic时代的Mac具有很少的内存,请不要担心;
  • 使用mmapPROT_NONE保留完整的0x100000000字节,然后按需在mprotect页上实际分配内存,并在不再有用时将它们放回PROT_NONE。在纸上看起来不错,但这意味着我必须实现malloc替换。

所以,我该怎么办?是否有内置机制可以让我尝试在特定地址范围内分配malloc样式的内存?否则,是否有我可以基于的良好,可读且开放源代码的malloc实现?

macos memory-management x86 emulation powerpc
2个回答
4
投票
我不知道执行此操作的内置方法,但是可以做一些工作。一种方法是创建一个自定义malloc区域,然后在分配需要对PPC代码可见的任何内存时使用常规malloc函数的malloc_zone_ *版本。您的自定义区域需要一个malloc实现,但是您可以从任意数量的开源代码中进行选择(例如tcmalloc)。还需要将其连接起来,以使用带有提示地址的vm_allocate之类的东西,以确保您在所需的确切范围内获得分配。

0
投票
因此,我本人已经考虑过这个问题,这是一个非常相似(未发布)的项目,因此尝试使用这种64位方法(或者实际上是x86上的任何大端存储空间!)令人讨厌的问题。
© www.soinside.com 2019 - 2024. All rights reserved.