2013-11-21 72 views
7

語境改變VM元

當我們想要改變的菲羅VM使用對象表,看看會發生什麼一個大學項目在調試時解釋在VM。

我們使用pharo-vm clone from github和VMMaker。構建虛擬機工作正常。

要開始我們增加了一個原始返回一個整數遞增:

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

和修改StackInterpreter class>>initializePrimitiveTable相應

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

和它的作品。

問題

當我們修改我們要試運行已經在SmalltalkImage所以我們不需要編譯,看看它是沒有工作的VM。

喜歡的東西:

StackInterpreter test: '1 inc' 

然後,我可以調試原始錯誤或發生錯誤。當然需要做更多的事情,但我怎麼能做到這一點?

我們試圖

  1. 類別VMMaker-InterpreterSimulationStackInterpreterSimulator。試圖代碼中的註釋

    DoIt 
        ^(StackInterpreterSimulator new openOn: Smalltalk imageName) test 
    

    錯誤:

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

    的字節串不明白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虛擬機fork中。這是因爲pharo船員中沒有人使用模擬器。我們只使用gdb的外部調試。實際上,Pharo人主要在VM插件上工作,VM的核心主要由Eliot Miranda在Squeak工作的維護和開發。因此,當VM核心發生錯誤時,我們會向他報告。

爲你的項目,你就必須把它在至少2個步驟分爲:

步驟1:用棧對象表工作VM

第2步:使你的對象表中的JIT工作

請注意,對於第2步,我建議不要改變對象訪問其標題的方式,因此需要一個類似VW的對象表,其中對象表中的對象表具有固定大小的標題,並且字段堆中的對象(也可能是頭擴展)。

所以使用StackVMSimulator並首先構建StackVM。當一切都會正常工作時(包括上下文),你可以考慮對JIT進行黑客攻擊。最近,Guillermo Polito將堆棧虛擬機移植到構建過程中(請參閱PharoSVMBuilder而不是PharoVMBuilder),一位傢伙報告說這個構建者存在問題,但您可以稍微修改它以使其工作。

現在讓模擬器在Pharo 2.0上工作(這是Pharo版本的生成器映像),您必須打開monticello瀏覽器並從Eliot的分支合併Cog包(repo MCHttpRepository location:'http: // source。squeak。org/VMMaker'),但不是最新的Cog,與當前Pharo-vm的VMMaker軟件包大致相同,因爲Eliot分支的最新Cog和VMMaker不穩定。

另一種方法是從艾略特的構建圖像開始,並將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腳本應該可以工作。

最後大約有模擬器一些文檔,但只針對CogSimulator(這些單證希望你已經知道了StackSimulator如何工作的,只是給你提示有關如何與JIT使用它): http://www.mirandabanda.org/cogblog/2008/12/12/simulate-out-of-the-bochs/ 和在名爲「Cog VM(part x)」的視頻之一中,x從1到6,Eliot展示了他如何使用模擬器來拆卸x86,打印堆棧並檢查堆。

另一個提示,請在Pharo郵件列表(Pharo用戶或Pharo開發者)上提問,因爲這裏沒有人會注意到你的問題(幸運的是這次有人指出我的問題)。

並告訴Pharo郵件列表,如果您在Pharo 2.0中運行模擬器,一些人(如我)對此非常感興趣。我打算在某個時候做到這一點。

祝你好運!好的項目無論如何。