2013-11-21 10 views
7

我々は、オブジェクト・テーブルを使用し、何が起こるかを見るためにファロのVMを変更したい大学のプロジェクトとして、コンテキストデバッグインタプリタVMプリミティブ

を変更します。

pharo-vm clone from githubとVMMakerを使用します。 VMの構築はうまくいきます。始めるため

我々はインクリメント整数を返すというプリミティブを追加しました:

InterpreterPrimitives>>primitiveIntegerIncrement 
    "increments an integer" 
    self pushInteger: self popInteger + 1 . 

MaxPrimitiveIndex := 576. 
"... and so on ..." 
    (575 primitiveFail) 
    (576 primitiveIntegerIncrement)) 

応じStackInterpreter class>>initializePrimitiveTableを変更し、それが動作します。

問題

我々はすでにSmalltalkImageで、実行をテストするために私たちは、コンパイルし、それが動作しませんでした確認する必要がありませんしたいVMに変更を加える。以下のような

何か:

StackInterpreter test: '1 inc' 

およびプリミティブが間違っているか、エラーが発生した場合、私はデバッグすることができます。もちろんもっと多くのことをする必要がありますが、これをどのように達成できますか?我々は

  1. カテゴリVMMaker-InterpreterSimulationクラスStackInterpreterSimulatorを試してみました何

    。コメントでコードをしようと

    DoIt 
        ^(StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    

    エラー:

    displayForm := 'Display has not yet been installed' asDisplayText form. 
    

    延ByteStringは理解していないasDisplayText

  2. (CogVMSimulator new openOn: Smalltalk imageName) test 
    (InterpreterSimulator new openOn: Smalltalk imageName) test 
    

    エラー:

    PrimitiveFailed: primitive #basicNew: in Array class failed 
    

私はまた、このスクリーンキャストを見つけたが、それは外側だけ使用してGBDからVMをデバッグします:http://vimeo.com/22485382#

私たちのプロジェクトは、ここでホストされている:我々は、オブジェクト表を実装し始め

http://smalltalkhub.com/#!/~kirstin/PharoObjectTable

現状。属性のルックアップはオブジェクトテーブルを通過できます。完全なオブジェクト・テーブルのサポートと直接ポイントの使用は非常に難しいです。なぜなら、どこでもポインタが期待されるからです。したがって、オブジェクトテーブルへのポインタを使用して、ルックアップがいつOTを通過するかを識別します。また、すべてのオブジェクト作成プリミティブを見つけて、新しいオブジェクトをテーブルに追加しました。

+1

参考のため、RoarVMを見てみたいですが、通常はオブジェクトテーブルがありますが、次のものがないバリアントもあります:https://github.com/smarr/RoarVM/tree/features/without-object-テーブルCogVMと比較して、JITコンパイラはなく、一般的には遅いです。しかし、それはまだ物事に接近する方法についてのいくつかの洞察を与えるかもしれません。 – smarr

答えて

4

あなたのプロジェクトとあなたの人数はどのくらいですか?あなたがしようとしていることは、かなりの仕事です。あなたは低レベルの行動についてよく知っていますか?

ここでの主な問題は、コグシミュレータがpharo vm forkで維持されていないことです。これは、Pharo乗組員の誰もシミュレータを使用していないからです。 gdbの外部デバッグだけを使用します。実際、Pharoの人々は主にVMプラグインで動作しますが、VMのコアは主にSqueakで動作するEliot Mirandaによって維持管理されています。したがって、VMコアにバグがある場合、彼に報告します。

ステップ1:あなたのプロジェクトのために

あなたは、少なくとも2つの段階でそれを分割する必要がありますスタックを持つオブジェクト表の作業を行うVM

ステップ2:あなたのオブジェクト表とJITの作品を作ります

ステップ2では、オブジェクトがそのヘッダーにアクセスする方法を変更しないことをお勧めします。したがって、オブジェクトテーブルの固定サイズのヘッダーを持つVWのようなオブジェクトテーブルと、ヒープ内のオブジェクト(およびおそらくヘッダー拡張子)の数。

したがって、StackVMSimulatorを使用して、まずStackVMをビルドします。すべてがうまくいくと(コンテキストを含む)、JITのハッキングについて考えることができます。最近、Guillermo PolitoはStack VMをビルドプロセスに移植しました(PharoVMBuilderの代わりにPharoSVMBuilderを参照)。このビルダーに問題があると報告しましたが、動作させるために少しハックする可能性があります。

シミュレータをPharo 2.0(あなたが持っているジェネレータイメージのPharoバージョン)で動作させるには、montyelloブラウザを開き、EliotのブランチからCogパッケージをマージする必要があります(repo MCHttpRepository location: 'http: // source。squeak。org/VMMaker ')、最近のCogではなく、Eliotのブランチの最新のCogとVMMakerが安定していないため、pharo-VMの現在のVMMakerパッケージとほぼ同じ日付になっています。

Eliotのビルドイメージから開始し、pharoブランチからのものをマージする方法があります。ここには、スクイーク開発用画像(http://www.mirandabanda.org/cogblog/build-image/)を構築する方法に関する情報があります。

はその後エリオットは、かつて私は、このスクリプトを与えた:

| cos | 
cos := CogVMSimulator newWithOptions: #(Cogit SistaStackToRegisterMappingCogit). 
cos desiredNumStackPages: 8. 
cos openOn: 'my/favourite.image'. 
cos openAsMorph; toggleTranscript; halt; run 

をあなたはSistaStackToRegisterMappingCogitオプションは必要ありません。私はStackVMSimulatorでいくつかの同様のスクリプトが動作するはずだと思います。 http://www.mirandabanda.org/cogblog/2008/12/12/simulate-out-of-the-bochs/ と:(これらのドキュメンテーションは、すでにあなたを期待StackSimulatorがどのように動作するかを知っている、とあなたがJITでそれを使用する方法についてヒントを与える)

は、最後に、シミュレータに関するいくつかのドキュメントがありますが、それはCogSimulatorのためだけです「Cog VM(part x)」というビデオの1つに、xは1から6までです。Eliotはシミュレータを使ってx86を逆アセンブルし、スタックを印刷してヒープを検査します。

もう一つのヒントは、pharoメーリングリスト(pharoユーザーまたはpharo開発者)の質問にお答えください。あなたの質問に誰も気付かないかもしれません(幸いなことに、

Pharo 2.0でシミュレータを実行できた場合はpharoメーリングリストで教えてください。私のような人は非常に興味があります。私はいつかそれをするつもりだった。

幸運を祈る!とにかく素晴らしいプロジェクト。

1

私がシミュレータを使用しようとした最後の時間は、およそ1年前です。私はそれを動作させませんでした。 はしかし、私は助けになるかもしれない統合やったことがなかったと仮定いくつかのパッチは、あります

号107はあなたのasDisplayText用のパッチが含まれて問題。