SOLIDターゲット
ターゲットはRustツールチェーンに存在する概念で、各ターゲットはプロセッサアーキテクチャ、ソフトウェア実行環境、ABI等の組み合わせを表します。
現行版のRustには以下のSOLID-OS用Tier 3ターゲット定義が含まれています。
Target name |
|
|
|
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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を使用して標準ライブラリをローカルでビルドするようにしています。