SOLIDターゲット

ターゲットはRustツールチェーンに存在する概念で、各ターゲットはプロセッサアーキテクチャ、ソフトウェア実行環境、ABI等の組み合わせを表します。

現行版のRustには以下のSOLID-OS用Tier 3ターゲット定義が含まれています。

Target name

target_arch

target_vendor

target_os

aarch64-kmc-solid_asp3

aarch64

kmc

solid_asp3

armv7a-kmc-solid_asp3-eabi

arm

kmc

solid_asp3

armv7a-kmc-solid_asp3-eabihf

arm

kmc

solid_asp3

target_os = "solid_asp3"

この target_os の値はASP3ABIを指しています。ASP3ABIはSOLID-OSに含まれるTOPPERS/ASP3とTOPPERS/FMP3の独自拡張で対応しているABI (Application Binary Interface)です。

Rust標準ライブラリはプラットフォーム固有のABIの上で実装されたプラットフォーム抽象化APIを提供しています。この部分はSOLIDターゲットではTOPPERS API上で実装されています。しかし、TOPPERSカーネルはプロファイル間ではABI互換性がありません。例えば、T_CTSK 構造体はTOPPERS/ASP3とTOPPERS/FMP3 (+ SOLID拡張) ではそれぞれ以下の通り定義されています。一方の定義を前提としたコードをそれとは異なるプロファイルのカーネルにリンクした場合、正常な動作は期待できません。

typedef struct t_ctsk {
    ATR         tskatr;     /* タスク属性 */
    intptr_t    exinf;      /* タスクの拡張情報 */
    TASK        task;       /* タスクのメインルーチンの先頭番地 */
    PRI         itskpri;    /* タスクの起動時優先度 */
    size_t      stksz;      /* タスクのスタック領域のサイズ */
    STK_T       *stk;       /* タスクのスタック領域の先頭番地 */
} T_CTSK;

typedef struct t_ctsk {
    ATR         tskatr;     /* タスク属性 */
    intptr_t    exinf;      /* タスクの拡張情報 */
    TASK        task;       /* タスクのメインルーチンの先頭番地 */
    PRI         itskpri;    /* タスクの起動時優先度 */
    size_t      stksz;      /* タスクのスタック領域のサイズ */
    STK_T       *stk;       /* タスクのスタック領域の先頭番地 */
    ID          iprcid;     /* タスクの初期割付けプロセッサ */ /* SOLID拡張 */
    uint_t      affinity;   /* タスクの割付け可能プロセッサ */ /* SOLID拡張 */
} T_CTSK;

Rust標準ライブラリ単体ではTOPPERS/FMP3の追加機能から享受できることはほとんどありませんが、ABIの差異がコード共用の妨げになります。そこで、TOPPERS/ASP3に基づいた共通ABI (ASP3ABIと呼びます) を導入することで、カーネル本来のABIのシンボル名と衝突しないようにしながら、一つの標準ライブラリの実装でTOPPERS/ASP3、TOPPERS/FMP3、また将来追加されうるカーネルに同時に対応できるようにしています。

Tier 3ターゲット

SOLIDターゲットはTier 3ターゲット (公式ドキュメント) です。Tier 3ターゲットはRustコンパイラの公式版でサポートされているものの、標準ライブラリのバイナリビルドがrustup経由で配布されていません。このため、SOLID-Rustでは -Z build-std (公式ドキュメント) というunstable featureを使用して標準ライブラリをローカルでビルドするようにしています。