RISC-V アーキテクチャ入門

最終更新: 2023-01-29 16:47:11 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

RISC-V は、ベース整数 ISA と、個別にバージョン管理される拡張で構成されたオープンな命令セットアーキテクチャです。ISA は命令の動作と特権実行を定義し、プラットフォームプロファイル、ABI、および実行環境が、相互運用可能なソフトウェアを実行するために必要な要件を追加します。

ベース整数 ISA とレジスタ規約 #

RV32I と RV64I は、それぞれ 32 ビットおよび 64 ビットの整数レジスタを提供します。どちらも x0 から x31 までの 32 個の汎用レジスタを定義します。x0 は常にゼロを読み出し、書き込みを破棄します。プログラムカウンタは、汎用レジスタとしてではなく、制御フローへの影響を通じてアーキテクチャ上可視になります。

RISC-V はロード/ストア方式を使用します。整数演算はレジスタオペランドを読み取り、レジスタに書き込みます。ロードとストアは、レジスタとメモリの間で値を移動します。ベース ISA は固定長 32 ビットのエンコーディングを使用します。RV64I は 64 ビットのレジスタと演算に加え、下位 32 ビット値に対する符号拡張付きの *W 演算を追加します。したがって、単にアドレスを広くした RV32I ではありません。

標準の整数呼び出し規約は、ABI 名と役割を次のように割り当てます。

RegistersABI namesRole
x0zero定数ゼロ
x1ra戻りアドレス
x2spスタックポインタ
x5-x7, x28-x31t0-t6caller-saved 一時レジスタ
x8-x9, x18-x27s0-s11callee-saved レジスタ
x10-x17a0-a7引数および戻り値

浮動小数点およびベクトルの呼び出し規約には、それぞれ固有の規則があります。コンパイル済みコードと連携するアセンブリは、スタックアラインメント、保存対象の状態、リロケーション、コードモデルを含む完全な psABI に従う必要があります。

拡張、ISA 文字列、プロファイル #

単一文字の標準拡張には、整数乗除算の M、アトミック操作の A、浮動小数点の F と D、圧縮命令の C、ベクトルの V があります。複数文字の拡張は、より限定的な機能を対象とし、ISA 文字列の文法で必要な場合はアンダースコアで区切られます。批准状況や後の改訂によって正確な契約が変わる可能性があるため、拡張のバージョンは重要です。

歴史的な G の略記は、必要な依存関係を含む IMAFD を中心とした汎用拡張セットを表します。rv64gc のような文字列は便利ですが、すべてのプラットフォーム機能、ABI、または特権機能を伝えるものではありません。ツールチェーンは拡張の順序を正規化し、依存関係を展開します。曖昧な文字列を自分で構築するのではなく、ツールチェーンの -march 診断を使用してください。

C 拡張は、頻繁に使用される操作に対して 16 ビットのエンコーディングを提供し、コード密度を向上させます。圧縮命令は、定義された操作のセマンティクスで実行され、より長いエンコーディングと混在できます。命令アラインメントと分岐先は、ターゲットが実装する拡張に従う必要があります。

RISC-V の プロファイルは、特定のシステムクラス向けに、必須およびオプションの ISA 機能を名前付きセットとして選択します。実装はカスタム拡張を公開することもできます。移植可能なソフトウェアは、すべての RV64 プロセッサが同じ ISA を実装していると仮定するのではなく、ハードウェアと実行環境の両方がサポートするプロファイルまたは明示的な拡張セットを対象にすべきです。

特権モード、CSR、トラップ #

特権アーキテクチャは、マシンモード(M)、スーパーバイザモード(S)、ユーザーモード(U)を定義します。M-mode は必須で、マシンを制御します。S-mode はオペレーティングシステムと仮想メモリをサポートし、U-mode はアプリケーションをサポートします。オプションの仮想化によって、ハイパーバイザーが制御する派生モードと二段階アドレス変換が追加されます。

制御ステータスレジスタ(CSR)は、トラップ状態、割り込みイネーブル、アドレス変換制御、カウンタ、拡張固有の状態を保持します。CSR アドレスは、アクセス制約と特権制約をエンコードします。権限のない命令は、より特権の高いレジスタへ暗黙的にアクセスするのではなく、トラップを発生させます。

トラップは原因、例外 PC、選択されたステータスを記録し、設定されたトラップベクタへ転送します。委譲レジスタは、選択したトラップを M-mode から S-mode へルーティングできます。ECALL は実行環境にサービスを要求し、MRET または SRET は特権ハンドラからの検査済み復帰を実行します。

スーパーバイザーソフトウェアは、ベンダー固有の M-mode ファームウェア呼び出しに依存すべきではありません。Supervisor Binary Interface(SBI)は、タイマー設定、プロセッサ間割り込み、hart 管理、システムリセット、ファームウェア支援による性能監視などのサービス向けに、移植可能なインターフェースを定義します。SBI は実行環境インターフェースであり、命令セット拡張ではありません。

仮想メモリと変換フェンス #

S-mode の変換方式には、RV32 向けの Sv32 と、RV64 向けの Sv39、Sv48、Sv57 などがあります。ページテーブルエントリは、有効性、読み取り/書き込み/実行、ユーザー、アクセス済み、ダーティーなどの属性を保持します。アクティブな方式とルートは satp によって選択されます。

ページテーブルへの書き込みによって、キャッシュされたすべての変換が自動的にコヒーレントになるわけではありません。SFENCE.VMA は、関連するページテーブル更新を順序付けし、指定されたスコープ内のアドレス変換キャッシュエントリを無効化します。マルチプロセッサでのシュートダウンには、リモート hart との調整も必要です。一般的には、SBI またはプラットフォーム固有のプロセッサ間割り込み経路を使用します。

メモリ順序付け、フェンス、アトミック操作 #

ベース RISC-V 弱メモリモデルでは、依存関係または同期によって禁止されない限り、観測結果がプログラム順序と異なることが許容されます。FENCE は、選択した先行クラスと後続クラスを順序付けします。一方、FENCE.I は、実行中の hart において、データ書き込みと後続の命令フェッチを協調させます。

A 拡張は、ロード予約/ストア条件付き操作とアトミックメモリ操作を提供します。取得(aq)ビットと解放(rl)ビットは、アトミック操作に順序付けを追加します。aqrl は両方向を提供します。アトミック性と順序付けは異なる問題を解決します。不可分なカウンタ更新だけでは、必要な順序付けも存在しない限り、関連しないデータを公開できません。

C、C++、Rust では、言語レベルのアトミック操作を優先すべきです。コンパイラがそれらのメモリモデルを、利用可能な RISC-V シーケンスへマッピングするためです。手書きアセンブリでは、拡張セット、メモリおよび I/O ドメイン、予約失敗、前方進行の規則を考慮する必要があります。

主なリファレンス #

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)