ブート

ブートでは、SOLIDのコアサービスを起動するために、メモリの初期化やコアサービスの転送を行う必要があります。 このために、要実装関数で、各ターゲットに合わせた初期化コードを追加してください。

ブート処理中は、MMUが無効、または仮想アドレス=物理アドレスの状態で動作します。

コアサービスが使用するメモリ領域(メモリマップデザイナにて SOLID_CORE で指定した部分)には、 ブートのコード、データ、スタック等を配置しないようにして下さい。

本項

SOLIDが対応するブートの手順は2通りあります。 1つはすでにブートローダーが存在し、そのブートローダーがSOLIDのデータをRAMに展開して実行する形式、もう1つはブートローダーが存在せず、IPLからSOLIDを実行する形式です。

ブートローダーが存在する場合

SOLID_USE_MONOBUILD を使用すると、すべてのコード、データをSOLIDの領域に配置します。bootをビルドしてできた solid_boot.out をバイナリ化して、SOLIDの物理アドレスに転送し、_solid_boot_start のアドレスから実行してください。 要実装関数では、IMPL_BOOT_Init にてペリフェラル等の初期化、SMP時には IMPL_BOOT_SMP_Init にて他コアの初期化を行ってください。

ブートローダーが存在しない場合

リセット後にアクセスできる領域にブートのコード、データを配置し、_solid_boot_start のアドレスから実行してください。 要実装関数では、ブートローダが存在する場合に実装する IMPL_BOOT_InitIMPL_BOOT_SMP_Init に加え、IMPL_BOOT_GetCsInfo および IMPL_BOOT_LoadCs にてプロジェクトで生成された .out ファイルを指定された領域に転送してください。

要実装関数

ブート関連の要実装関数の定義は、impl_boot.h にあります。

#include "impl_boot.h"

IMPL_BOOT_Init

void IMPL_BOOT_Init()

デバイスの初期化をします。

主にメモリ、およびCPU周辺のIOを初期化してください。

IMPL_BOOT_GetArgument

void IMPL_BOOT_GetArgument(unsigned char *args, unsigned long size)

引数の設定をします。

起動時にコアサービスへ渡す引数を設定してください。

パラメータ:
  • arg -- 引数を格納するバッファ

  • size -- 引数の最大サイズ

IMPL_BOOT_GetCsInfo

void IMPL_BOOT_GetCsInfo(void *pBuf, unsigned long bufSize)

コアサービスのバイナリ情報を取得します。

solid_cs.bin の先頭のデータを転送してください。 SOLID_USE_MONOBUILD を使用している場合は実装は不要です。

パラメータ:
  • pBuf -- 転送する位置

  • bufSize -- 転送するサイズ(byte)

IMPL_BOOT_LoadCs

void IMPL_BOOT_LoadCs(void *pAddr)

コアサービスのバイナリを転送します。

solid_cs.bin を指定位置に転送してください。 SOLID_USE_MONOBUILD を使用している場合は実装は不要です。

パラメータ:
  • pAddr -- solid_cs.bin を転送する先頭アドレス

SMP時の要実装関数

SOLID_BOOT_SMP_INFO

typedef struct _SOLID_BOOT_SMP_INFO_ SOLID_BOOT_SMP_INFO
struct _SOLID_BOOT_SMP_INFO_

説明

SMP起動用情報の構造体

定義

typedef struct _SOLID_BOOT_SMP_INFO_ {
    unsigned long bootAddress;
    int nCpus;
} SOLID_BOOT_SMP_INFO;

メンバー

unsigned long bootAddress

他CPUのジャンプアドレス

int nCpus

SOLIDで使用するCPUの数

IMPL_BOOT_SMP_Init

void IMPL_BOOT_SMP_Init(SOLID_BOOT_SMP_INFO *pInfo)

SMP時の他CPUの初期化を行います。

CPUがリセット状態の場合は、ここで解除してください。

パラメータ:
  • pInfo -- SMP起動用情報へのポインタ