【发布时间】:2012-11-11 03:05:27
【问题描述】:
我正在为 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会要求以页面倍数进行分配,这对我来说似乎非常浪费,因为我需要为每个分配提供一个完整的页面,不管它有多小(尽管这实际上可以考虑到经典时代的 Mac 与现代计算机相比内存非常少,这没关系); - 使用
mmap保留完整的0x100000000 字节和PROT_NONE,然后使用mprotect页面在需要时实际分配内存,并在它们不再有用时将它们放回PROT_NONE。它在纸面上看起来不错,但这意味着我必须实现malloc替换。
那么,我该怎么办?是否有内置机制可以让我尝试在特定地址范围内分配内存malloc-style?否则,是否有一个好的、可读的、开源的 malloc 实现我可以作为基础?
【问题讨论】:
-
天哪。如果你有这个甚至部分工作,我很乐意看到它!你能把它扔到 Github 上吗?
-
@duskwuff,一定会的!我目前能够运行一个 hello world 程序。我的下一个目标是来自 MPW 工具的 Unmangle 可执行文件(这就是解释器变得丑陋的地方)。我正在开发一个图形调试器,当我有一些至少可以在 Cocoa 窗口中显示反汇编的东西时,我会将它推送到 github(可能是今天)。我的 github 句柄是zneak。
-
(我只是不希望我的第一次推送太不完整。)
-
有兴趣的朋友,我just published the project to GitHub。
-
是否可以通过包含定义的变量来创建空间?您是否希望从磁盘加载它,其中包含文本字典之类的内容(它会很大),然后只在该空间内分配?
标签: macos memory-management x86 emulation powerpc