私が Mac OS X 用に Mac OS 9 の「互換性レイヤー」を書いているのは、最近懐かしさに襲われたからです。現在のすべてのソリューションでは、仮想マシン内で Classic を実行する必要があり、実行する必要があるものすべてをサポートしていないためです。使いたい。
その目標を達成するために、PEF 実行可能ローダー、ネイティブ コードにブリッジできる PowerPC インタープリター、およびいくつかの Mac OS 9 ライブラリを実装しました。全体的にうまくいっています。インタプリタにいくつかのバグがありますが、それは予想されていたことであり、私はそれに取り組んでいます。
これまでの私の最大の問題は、PowerPC プログラムが 32 ビットであるため、ポインターも 32 ビットである必要があるということです。その制約を満たすために、現在私は i386 用にのみコンパイルしています。ただし、そのコアを中心に構築しようとすると、ますます制約が厳しくなります (たとえば、32 ビットの Cocoa アプリケーションで ARC を使用することはできません)。言うまでもなく、PowerPC コードがホスト プロセスがアクセスできるすべてのものにアクセスできるようにすることは、非常に安全ではありません。
最終的に 64 ビットに切り替えることを念頭に置いて「プラットフォーム」を設計しました。インタープリターはベース アドレスを予期し、すべての PowerPC ポインターはそのベース アドレスによってオフセットされます。(パフォーマンスと設計上の理由から、PowerPC アドレスをネイティブ アドレスに変換するマップを持つことは論外です。)
64 ビット アドレス空間には、40 億個の独立した 32 ビット アドレス空間をホストするのに十分なスペースがあるため、これは私にとって良い方法のように思えます。
しかし、まだ問題があります。そのアドレス範囲内にメモリを割り当てることができるようにする必要があります。PPC インタープリターがその範囲外にアクセスすることは不可能だからです。
私が今考えている解決策は2つあります。
- 特定のアドレス範囲内に何かを割り当てるように Mac OS に依頼できるかどうか調べてください。を使用できることはわかっています
mmap
がmmap
、ページの倍数で割り当てを要求します。これは、割り当てごとにページ全体が必要になるため、非常に無駄に思えます。当時の Mac は、現代のコンピューターに比べてメモリがほとんどありませんでした)。 mmap
で完全な 0x100000000 バイトを予約するために使用しPROT_NONE
、mprotect
オンデマンドでページを作成して、必要なときに実際にメモリを割り当て、不要になったときに元に戻しPROT_NONE
ます。紙の上では良さそうに見えますが、malloc
代わりを実装する必要があるということです。
それで、私は何をすべきですか?malloc
特定のアドレス範囲内にメモリを割り当てようとする組み込みのメカニズムはありますか? malloc
それ以外の場合、自分自身のベースにできる、読みやすくオープンソースの優れた実装はありますか?