kvmドキュメント翻訳-第4章


説明
KVMのドキュメントを翻訳するのは、個人の学習のために記録するだけです.翻訳が行き届いていないところがあれば、指摘してください.修正します.
ドキュメントを翻訳する理由
このKVMは現在特別な火のKernel-based Virtual Machine(オープンソースのシステム仮想化モジュール)ではない.JAVAの仮想マシンですJ 2 ME cldcの実現である.そのソースコードの難易度はhotspotよりずっと簡単だ.そこでKVMを研究することでhotspotの理解を深めたい
特定のプラットフォームに移植するために必要な特定のファイルと関数
このセクションでは、プラットフォームごとに定義する必要があるファイルと関数について説明します.
machine_md.h
各kvmプラットフォームにはvmport/h/machineという名前のプラットフォームが必要です.md.hのファイル.このファイルの目的はvmcomon/h/mainを上書きすることです.hで提供されるデフォルトのコンパイル時に定義および宣言され、特定のプラットフォームに必要なその他の定義および宣言が提供される.6章「フラグ、定義、マクロのコンパイル」を参照して、ポートが通常書き換える必要がある定義と宣言のリストを取得します.
すべてのプラットフォーム固有の宣言、関数プロトタイプ、typedef文、include文、define文がここに表示される必要がありますmachine_md.hに直接または間接的にmachine_に含めるmd.hには、開発環境に自動的に含まれるファイルやcompiLERスイッチがある.
プラットフォーム固有の機能は、任意のマシン固有のファイルに表示されます.他に説明がない限り、必要なプラットフォーム固有の関数をマクロとして定義することもできます.これは、各パラメータが1回しか計算されないことに注意して実装することを前提としています.
File main.c
通常、ターゲットプラットフォームに適したmainを提供する必要があります.cの新しいバージョン.ディレクトリvmextra/src/main.cで提供されるデフォルトのインプリメンテーションは、プラットフォーム固有のインプリメンテーションの開始点として使用することができる.詳細については、7章「VM起動」を参照してください.
関連するランタイム関数のマイグレーション
各プラットフォームは、以下に示す関数を定義する必要があります(vmcomon/h/runtime.hを参照).マクロまたはCコードとして定義できます.従来、Cコードはvmport/src/runtimeという名前に置かれている.cのファイルに
  • void AlertUser(const char*message)は、ユーザーに重大なイベントが発生したことを警告します.この関数呼び出しは、通常、致命的なエラーの前に表示されます.
  • cell*allocateHeap(long*sizeptr,void**realresultptr)は、sizeptの約サイズのスタックをバイト単位で作成します.スタックは4の倍数のアドレスで開始する必要があります.スタックのアドレスは、この関数の値として返されます.スタックの実際のサイズ(バイト単位)は*sizeptrで返されます.スタックを解放するとき、*realresultptrに配置された値がfreeheapのパラメータとして使用されます.ほとんどのプラットフォームでは、*realResultPtrは、ローカル空間割り当て関数が返す実際の値に設定されます.値が4の倍数でない場合は、次の4の倍数に四捨五入し、*sizeptは4を減らします.
  • void freeHeap(void*heapPtr)allocateheapを使用して割り当てられたスタックスペースを解放します.上のheappptrパラメータの意味を参照してください.
  • void GetAndStoreNextKVMEvent(bool_t forever,ulong 64 waitUntil)この関数は、仮想マシンとホストオペレーティングシステムのイベント処理機能との間のインタフェースとして使用されます.(vmcomon/h/events.hで定義)詳細は、12章を参照してください.
  • void InitializeVM()は、必要に応じて仮想マシンを初期化します.現在サポートされている多くのプラットフォームでは、これは何の役にも立たないマクロです.
  • void InitializeNativeCode()は、任意の必要に応じてローカルコードを初期化する.プラットフォームは、この関数(たとえば、ウィンドウシステムを初期化し、ローカルコード固有の他の初期化を実行することができます.
  • void InitializeClassLoading()は、必要に応じてクラスローダを初期化します.プラットフォームは、この機能(たとえば、ファイル/ストレージシステムの初期化など)を使用して実行できます.
  • void InitalizeAsynchronousIO(void)非同期ローカルメソッド
  • を処理するためにシステムを初期化する
  • void FinalizeVM()は、仮想マシンをシャットダウンする前に必要なクリーンアップを実行する.
  • void FinalizeNativeCode()は、ローカル関数の後に必要なクリーンアップを実行します.多くのプラットフォームでは、この機能を使用してウィンドウシステムを閉じます.
  • long RandomNumber_md()は乱数
  • を返す
  • void FinalizeClassLoading()クラスローダを閉じる前に必要なクリーンアップを実行します.プラットフォームでは、この機能(たとえば、ファイル/ストレージシステムの一部の終了操作)を実行できます.
  • ulong64 CurrentTime_md(void)は、1970年1月1日のUTC以来の時間(ミリ秒)を返す.タイムゾーンの概念をサポートしないデバイスでは、1970年1月1日から現在のタイムゾーンに戻る時間(ミリ秒単位)を受け入れることができる.
  • unsigned long *Calendar_md(void)は、日付のカレンダーに関連する属性を表すカレンダーフィールドを初期化する.

  • グローバル変数を設定する前と、メモリ管理システムを初期化する前に、関数initializeNativeCode()とinitializeVM()を順番に呼び出します.
    関数FinalizeVM()は、FinalizeNativeCode()の前に呼び出されます.分析が有効なプラットフォームでは、この2つの関数の呼び出し間に分析情報が出力されます.これにより、プローブは、必要に応じてウィンドウシステムに関する情報を検索し、ウィンドウシステムを使用して出力を作成できます.
    注意-KVMを使用して、モバイル情報デバイスプロファイル(MIDP)またはPDAプロファイルで定義されたライブラリなどの他のライブラリを実行する場合は、これらのライブラリに必要なネイティブ機能を移植するために、他の移行作業が必要です.
    非同期ローカル関数.プラットフォームが非同期ローカルメソッドをサポートしている場合は、ポート固有の他の関数を定義する必要があります.
  • yield_md()
  • CallAsyncNativeFunction_md()
  • enterSystemCriticalSection()
  • exitSystemCriticalSection()

  • Note-関数entersystemCriticalSection()とexitSystemCriticalSection()のインタフェースはvmcomon/h/thread.hで定義します.これらの関数は§11.4でさらに説明する.
    必要なCライブラリサポート
    KVMは以下のCライブラリ関数を使用します.
  • Stringの操作関数:strcat,strchr,strcmp,strcpy,strncpy,strlen
  • メモリの操作:memcpy,memove,memset,memcmp
  • 印刷:atoi,sprintf,fprintf,putchar
  • 乱数生成:rand
  • 異常処理:setjmp,longjmp(not absolutely necessary)
  • 開発環境がこれらの関数を定義していない場合は、自分で定義するか、マクロを使用して開発環境識別の等価関数にマッピングする必要があります.
    memmove関数は、ソースとターゲットが重なる場合を処理できる必要があります.関数memcpyは、既知のソースとターゲットが重ならない場合にのみ使用する.
    関数fprintfとsprintfは、次のフォーマットを使用します.
    %s, %d, %o, %x, %ld, %lo, %lx, %% 
    

    これらのフォーマットには、オプションやフラグはありません.
    printfは直接呼び出されません.
    注–ディレクトリvmextraに含まれるコンポーネントと、このバージョンで提供されるマシン固有のプラットフォームには、上記にリストされていない他のネイティブ機能が必要になる場合があります.
  • 例えば、Metrowerks CodeWarriorは、ユーザがプレフィックスファイルを作成することを可能にする.
  • 一部のコンパイラでは、
  • に相当するスイッチ-dname=valueを追加できます.
    #define name value
    

    ファイルの先頭に置く
  • プラットフォームによってパラメータの順序が異なる場合があります.たとえば、関数memsetはパラメータmemset(location,value,count)を使用します.対応するpalm os関数はmemset(location,count,value)である.