zne*_*eak 12 macos memory-management retro-computing
我正在为Mac OS X编写一个Mac OS 9"兼容层",因为我最近对这种怀旧感到震惊,并且因为所有当前的解决方案都要求你在虚拟机中运行Classic,它不支持所有应该运行的东西我想用.
为了实现这一目标,我实现了一个PEF可执行加载器,一个可以桥接到本机代码的PowerPC解释器,以及一些Mac OS 9库.整个事情都有点工作:解释器中有一些错误,但这是预期的,我正在努力.
到目前为止,我最大的问题是PowerPC程序是32位,所以指针需要是32位.为了满足这个约束,目前我只为i386编译.但是,当我试图围绕该核心进行构建时,它变得越来越受限制(例如,您不能将ARC与32位Cocoa应用程序一起使用).更不用说让PowerPC代码访问主机进程可以访问的所有东西并不是超级安全的.
我设计了"平台",最终切换到64位:解释器需要一个基地址,所有PowerPC指针都被该基地址偏移.(出于性能和设计原因,有一个将PowerPC地址转换为本地地址的地图是不可能的.)
由于64位地址空间有足够的空间容纳四十亿个独立的32位地址空间,这听起来像是一个很好的方式.
但我仍然有一个问题:我需要确保我能够在该地址范围内分配内存,因为PPC解释器不可能访问它之外的任何内容.
我现在正在考虑两种解决方案:
mmap,但mmap会要求页面倍数的分配,这对我来说似乎非常浪费,因为我需要为每个分配一个完整的页面,无论它多么小(尽管考虑到经典 - 这实际上可以是好的)与现代计算机相比,Mac的内存非常少;mmap保留一个完整的0x100000000个字节PROT_NONE,然后mprotect在需要的页面在需要时实际分配内存,并把他们带回PROT_NONE时,他们没有什么用处了.它在纸面上看起来不错,但这意味着我必须实施malloc替代品.所以我该怎么做?是否有内置机制让我尝试malloc在特定地址范围内分配内存?否则,是否有一个良好的,可读的,开源的实现,malloc我可以自己?
小智 0
因此,我自己在一个非常相似的(未发布的)项目中考虑过这个问题,并尝试使用这种 64 位方法(或者,实际上 x86 上的任何类型的大端存储空间!)很快遇到了一些令人讨厌的问题。
虽然您可以将本机 API 指向模拟结构,但您不能强迫它们在该区域内进行所有自己的分配。您可以提供您自己的所有最明显的实现,例如_NewPointer,但其他函数(例如,_NewWindow使用 nil wStorage)的内部分配很大程度上不受您的控制。
由模拟代码分配的系统结构(例如,矩形)将是大端字节序,但操作系统希望它们是小端字节序。除了可能在进出本机函数时对所有内容进行字节交换之外,没有简单的方法可以解决这个问题,而且这似乎非常容易出错。(我在这里考虑的另一种方法是让模拟核心以小端方式运行,但不幸的是,有些程序对这种变化很敏感。)
需要明确的是,我非常喜欢 Classic 到 OS-X API 转换器的想法。但我很确定这是不切实际的——考虑到苹果公司结束了在 PPC 上使用经典版虚拟机,我怀疑他们认为翻译方法行不通。
| 归档时间: |
|
| 查看次数: |
1087 次 |
| 最近记录: |