macos - 如何让 Mac OS 在特定地址范围内分配内存?

标签 macos memory-management x86 emulation powerpc

我正在为 Mac OS X 编写 Mac OS 9“兼容层”,因为我最近充满了怀旧之情,而且因为所有当前的解决方案都要求您在虚拟机内运行 Classic,而该虚拟机并不支持它应该运行的所有内容我想用的东西。

为了实现这一目标,我实现了一个 PEF 可执行加载程序、一个可以桥接到 native 代码的 PowerPC 解释器以及一些 Mac OS 9 库。整个事情进展顺利:解释器中存在一些错误,但这是预料之中的,我正在努力解决这个问题。

到目前为止我最大的问题是PowerPC程序是32位的,所以指针需要是32位的。为了满足这个限制,目前我只针对 i386 进行编译。然而,当我尝试围绕该核心构建时,它变得越来越有限制(例如,您不能将 ARC 与 32 位 Cocoa 应用程序一起使用)。更不用说让 PowerPC 代码访问主机进程可以访问的所有内容并不是 super 安全。

我在设计“平台”时考虑到最终会切换到 64 位:解释器需要一个基地址,并且所有 PowerPC 指针都通过该基地址进行偏移。 (出于性能和设计原因,拥有将 PowerPC 地址转换为 native 地址的映射是毫无疑问的。)

由于 64 位地址空间有足够的空间来托管 40 亿个独立的 32 位地址空间,这听起来对我来说是一个好方法。

但我仍然有一个问题:我需要确保能够在该地址范围内分配内存,因为 PPC 解释器不可能访问该地址范围之外的任何内容。

我现在想到的解决方案有两种:

  • 了解我是否可以要求 Mac OS 在特定地址范围内分配某些内容。我知道我可以使用 mmap,但是 mmap 会要求以页面倍数进行分配,这对我来说似乎非常浪费,因为我每次分配都需要一个完整的页面,不不管它有多小(尽管考虑到经典时代的 Mac 与现代计算机相比内存非常小,这实际上可能没问题);
  • 使用 mmap 通过 PROT_NONE 保留完整的 0x100000000 字节,然后按需使用 mprotect 页面在需要时实际分配内存,并将当它们不再有用时,它们会返回到 PROT_NONE。纸面上看起来不错,但这意味着我必须实现 malloc 替换。

那么,我该怎么办?是否有一种内置机制可以让我尝试在特定地址范围内以 malloc 方式分配内存?否则,是否有一个良好的、可读的、开源的 malloc 实现可供我引用?

最佳答案

我不知道有什么内置方法可以做到这一点,但只需做一些工作就可以实现。一种方法是创建自定义 malloc 区域,然后在分配需要对 PPC 代码可见的任何内存时使用常用 malloc 函数的 malloc_zone_* 版本。您的自定义区域需要 malloc 实现,但您可以从任意数量的开源实现中进行选择(例如 tcmalloc)。它还需要连接以使用诸如带有提示地址的 vm_allocate 之类的东西,以确保您获得所需的确切范围内的分配。

关于macos - 如何让 Mac OS 在特定地址范围内分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13517396/

相关文章:

macos - VS Code 不会保存更改 - Mac

c++ - 我该如何处理这个 CP 任务?

c - SIMD以下代码

x86 - int 13h 42h 在 Bochs 中不加载任何东西

c - 为什么在使用内部函数时生成的程序集会重新排序?

macos - OS X/Linux : pipe into two processes?

objective-c - 以编程方式重命名 NSDocument 文件时防止警告

objective-c - 我应该只从主线程调用 NSSavePanel runModal 方法吗?

C 数组实例化 - 堆栈或堆分配?

Hadoop 参数 mapreduce.map.memory.mb 和 mapreduce.map.java.opts