これは RISC-V Instruction Set Manual Volume 2, Privileged Spec v. 20211203 の二次的著作物です。 この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。
-
-
Save kotet/ccdf1d6adb97de6b4e68c93c8db348c3 to your computer and use it in GitHub Desktop.
mstatus
レジスタはMXLEN
ビットのレジスタであり、図3.6,3.7のようなフォーマットをしている。
mstatus
レジスタはhartsの実行状態の保持と操作を行う。
SレベルISAにはmstatus
レジスタの制限されたビューとしてsstatus
レジスタが存在する。
31 | 30 .. 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 .. 15 | 14 .. 13 | 12 .. 11 | 10 .. 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SD | WPRI | TSR | TW | TVM | MXR | SUM | MPRV | XS[1:0] | FS[1:0] | MPP[1:0] | VS[1:0] | SPP | MPIE | UBE | SPIE | WPRI | MIE | WPRI | SIE | WPRI |
(訳注: WPRIは予約領域。読み込み専用の0にしておく必要がある)
63 | 62 .. 38 | 37 | 36 | 35 .. 34 | 33 .. 32 | 31 .. 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 .. 15 | 14 .. 13 | 12 .. 11 | 10 .. 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SD | WPRI | MBE | SBE | SXL[1:0] | UXL[1:0] | WPRI | TSR | TW | TVM | MXR | SUM | MPRV | XS[1:0] | FS[1:0] | MPP[1:0] | VS[1:0] | SPP | MPIE | UBE | SPIE | WPRI | MIE | WPRI | SIE | WPRI |
RV32においてはmstatush
の30:4
がRV64のmstatus
レジスタのビット62:36を含む。
Global interrupt-enableビットがMモードとSモードに対してそれぞれMIE
、SIE
として提供される。
このビットは割り込みハンドラのatomicityを保証するために使われる。
hartがモードx
で実行されている時、割り込みはxIE==1
のときglobally enabledであり、xIE==0
のときglobally disabledである。
現在より低いモードw<x
の割り込みは、wIE
ビットの値に関係なく無効である。
現在より高いモードy>x
の割り込みは、yIE
ビットの値に関係なく有効である。
高い特権レベルのコードは、自分より低いレベルに制御を渡す前に各割り込み固有の有効ビットを設定することで自分のレベルの割り込みを無効化できる。
上位レベルの割り込みをすべて無効化することももちろん可能だが、同期トラップ、ノンマスカブル割り込み、リセットしか復帰の手段がなくなってしまうので通常はやらない。
ネストしたトラップをサポートするために、各特権モードはIE
ビットと特権モードの2レベルスタックを持つ。
xPIE
はトラップの前のxIE
ビットの値を保持する。
xPP
は前の特権モードを保持する。
xPP
にはx
以下のモードしか入らないため、MPP
は2ビットでSPP
は1ビットである。
特権モードy
から特権モードx
へのトラップが発生したとき、xPIE
にはxIE
の値が入り、xIE
には0がセットされる。xPP
はy
になる。
低い特権モードでは、任意のトラップは通常上位の特権モードで起き、割り込みは入るときに無効化される。 上位のトラップハンドラはトラップとリターンをスタック情報をもとに提供するか、または割り込まれたコンテキストに直ちに戻らない場合は、割り込みを再有効化する前にスタックを保存するため。スタックには1エントリしか必要ない。
MRET
とSRET
命令はそれぞれMモードとSモードのトラップから帰るために使う。
xRET
命令を実行したとき、xPP
がy
だったならば、xIE
はxPIE
にセットされ、特権モードはy
に変更され、xPIE
は1になり、xPP
はサポートされている中で最も低いモードになる(Uモードが実装されているならUになる)。
さらにxPP != M
のときは、MPRV
に0をセットする。
xPP
にサポートされる最も低い特権モードを入れることは、ソフトウェアバグの発見に役立つ。
xPP
はWARLであり、x
以下の特権モードが入る。モードx
が実装されていない場合、xPP
は読み込み専用の0でなければならない。
MモードのソフトウェアはMPP
に値を書き込んでからそれを読むことで実装されている特権モードを検出できる。
マシンがUとMしか提供しない場合、MPP
に必要なハードウェアストレージは00と11を表現するための1ビットしか必要ない。
RV64システムにおいて、SXL
とUXL
フィールドはそれぞれSモードとUモードでのXLEN
を操作するWARLのフィールドである。
エンコーディングはmisa
レジスタのMXL
と同じである。(表3.1参照)
MXL | XLEN |
---|---|
1 | 32 |
2 | 64 |
3 | 128 |
RV32システムでは、SXL
とUXL
フィールドは存在せず、SXLEN=32
,UXLEN=32
である。
RV64システムにおいて、Sモードがサポートされないとき、UXL
は読み込み専用で0である。サポートされるときはSXLEN
の値をエンコードするWARLフィールドである。
実装はUXL
を読み込み専用にして、常にUXLEN=MXLEN
やUXLEN=SXLEN
にできる。
各モードのXLEN
はサポートされる最大のXLEN
以下に設定される。
すべての操作は、ソースオペランドレジスタの、設定されたXLEN
より上のビットを無視しなければならない。
また、符号拡張はサポートされるXLEN
の最大までディスティネーションレジスタを埋めなければならない。
同様に、XLEN
より上のpc
のビットは無視され、pc
に書き込みがあった時は、符号拡張はサポートされる最大のXLEN
まで行われる。
実装依存の振る舞いを避けるため、仕様は常にハードウェアレジスタ全体を定義された値で埋めることを要求している。
ハードウェアの複雑性を削減するために、低い特権モードのXLEN
が上位の特権モードのXLEN
以下かのチェックを課していない。
そのような設定はソフトウェアのバグだが、マシンの操作はwell-definedである。
MXLEN
が32から広がった時、mstatus
のSXL
とUXL
フィールドは、single valueに制限されていない場合、サポートされている中で新しいMXLEN
以下の最も広い値をとる。
MPRV
(Modify Privilege)ビットはeffective privilege mode、たとえばロードやストアを実行する特権モードを変更する。
MPRV==0
のとき、ロードとストアは通常通り振る舞い、現在の特権モードの変換/保護メカニズムに従う。
MPRV==1
のとき、ロードとストアのメモリアドレスは現在の特権モードがMPP
にセットされた値であるかのように変換、保護、エンディアンが適用される。
命令アドレス変換と保護はMPRV
の値の影響を受けない。
MPRV
はUモードがサポートされないとき読み込み専用の0になる。
特権モードをMより低くするMRET
命令やSRET
命令はMPRV=0
という設定をする。
MXR
(Make Executable Readable)ビットは仮想メモリのロードアクセスを行う特権モードを変更する。
MXR==0
のとき、読み込み可能なページ(ページテーブルでR==1
と設定されているページ)のみ読み込める。
MXR==1
のとき、ページの読み込みは読み込み可能または実行可能なもの(R==1 || X==1
)が成功する。
MXR
はページベース仮想メモリが働かないときには影響がない。
MXR
はSモードがサポートされないときは読み込み専用の0になる。
MPRV
とMXR
メカニズムはロードやストアのミスアラインのようなハードウェア機能の不足をエミュレートするMモードのルーチンの効率性のために考案された。
MPRV
はソフトウェアでアドレス変換を行う必要をなくす。
MXR
は実行のみが許可されているページから命令ワードを読むことを可能にする。
現在の特権モードと、MPP
で指定されている特権モードのXLEN
は異なる可能性がある。
MPRV==1
のとき、ロードとストアのメモリアドレスは3.1.6.2のルールに従い、現在のXLEN
がMPP
のXLEN
であるかのようにふるまう。
SUM
(Permit Supervisor User Memory Access) ビットはSモードの仮想メモリへのロードとストアの特権を変更する。
SUM==0
のとき、SモードのUモードがアクセス可能なページ(U==1
)へのメモリアクセスは失敗する。
SUM==1
のとき、そのようなアクセスは許可される。
SUM
は仮想メモリシステムの影響下にない場面では影響がない。
SUM
はSモードで実行されている時以外は無視され、これはMPRV==1
でMPP==S
のときも同様である。
SUM
はSモードがサポートされていないときやsatp.MODE
が読み込み専用の0(訳注: アドレス変換/保護がサポートされない)になっているときは読み込み専用の0になる。
MXR
やSUM
メカニズムはページテーブルエントリの許可の解釈にのみ影響する。
PMA
やPMP
によるアクセスフォールト例外には影響しない。
MBE
, SBE
, UBE
は命令フェッチ以外のメモリアクセスのエンディアンを制御する。
命令フェッチは常にリトルエンディアンである。
MBE
はMモードからの非命令フェッチメモリアクセスを(mstatus.MPRV == 0
であると仮定して)リトルエンディアン(MBE==0
)かビッグエンディアン(MBE==1
)にする。
Sモードがサポートされないとき、SBE
は読み込み専用のゼロである。そうでないとき、SBE
はUモードからの明示的ロードとストアがリトルエンディアン(SBE==0
)かビッグエンディアン(SBE==1
)かを制御する。
UBE
も同様。
ページテーブルのようなメモリ管理データ構造への暗黙的アクセスのエンディアンは常にSBE
によって制御される。
SBE
の変更は実装がそのようなデータ構造をどのように解釈するかを変えるため、SBE
が変更された後もデータ構造を利用するなら、MモードソフトウェアはSFENCE.VMA
命令をrs1=x0,rs2=x0
で実行することで変更に追従しなければならない。
メモリ管理データ構造がリトルエンディアンとビッグエンディアンの両方で解釈されるというのは非常に不自然な状況である。
実用上、SBE
はworld switch(訳注: ゲストOSの切り替え)の実行時にのみ変更され、その場合においては新旧のメモリ管理データ構造はそれぞれ異なるエンディアンで再解釈される。
この場合において、world switchに必要な分以上のSFENCE.VMA
命令は不要である。
Sモードがサポートされるとき、実装はSBE
をMBE
の読み込み専用のコピーにできる。
Uモードがサポートされるとき、実装はUBE
をMBE
かSBEの読み込み専用のコピーにできる。
MBE
,SBE
,UBE
がすべて読み込み専用の0のとき、実装はリトルエンディアンのメモリアクセスのみをサポートする。
MBE
が読み込み専用の1で、各モードがサポートされるときにSBE
とUBE
がそれぞれ読み込み専用の1であるとき、実装はビッグエンディアンのメモリアクセスのみをサポートする。
Volume 1ではhartsのアドレス空間を連続したアドレスの2^XLEN
バイトのcircular sequenceであると定義した。
アドレスとバイトの配置の対応はエンディアンに影響されず、固定である。
エンディアンはメモリバイトとマルチバイト量(halfword, word, etc)の間のマッピングの順番を決定する。
標準RISC-V ABIはリトルエンディアンかビッグエンディアンのどちらかのみを期待しており、エンディアンの混在に適応しない。 しかしながらエンディアンの制御は定義され許可されている。 例として、OSをあるエンディアンで実行し、ユーザーモードアプリケーションを別のエンディアンで実行するといったことがありうる。 メモリアクセスのエンディアンを必要に応じてソフトウェアで反転させるような、非標準的な使用法も考慮されている。
RISC-V命令はエンディアンの設定から切り離され、一様にリトルエンディアンであり、これはハードウェアとソフトウェアにとって都合がよいためである。 エンディアンの設定に従うとすると、実行時にエンディアンが動的に変化する可能性があるため、RISC-Vアセンブラとディスアセンブラは常に現在のエンディアンを知る必要がある。 一方で、命令のエンディアンが固定されていれば、PIC (position-independent code)のようなエンディアンに依存しないよう注意して書かれたソフトウェアが可能になる。 しかし、命令をリトルエンディアンのみにするという選択はマシン命令をエンコード/デコードするRISC-Vソフトウェアに影響がある。 ビッグエンディアンモードでは、そのようなソフトウェアは命令の明示的ロード/ストアのエンディアンが逆であるという事実に直面し、ロード後やストア前にバイトオーダーをスワップする必要がある。
TVM
(Trap Virtual Memory)ビットはスーパーバイザ仮想メモリ管理操作のインターセプティングをサポートするWARLのフィールドである。
TVM==1
のとき、Sモードで実行中に行われたsatp
CSRへの読み書きやSFENCE.VMA
、SINVAL.VMA
命令は不正命令例外を引き起こす。
TVM==0
のとき、これらの操作はSモードで許可される。
TVM
はSモードがサポートされないとき読み込み専用の0になる。
TVMメカニズムは、ゲストオペレーティングシステムをUモードを使った古典的な仮想化ではなく、Sモードで実行することを許可することで仮想化の効率化につながる。
このアプローチによってSモードのほとんどのCSRへのアクセスをトラップする必要がなくなる。
satp
へのアクセスとSFENCE.VMA
、SINVAL.VMA
命令のトラップによって、シャドウページテーブルをlazyに設定するために必要なフックが提供される。
TW
(Timeout Wait)ビットはWFI
命令(訳注: Wait for Interrupt, 3.3.3節参照。実装はこの命令をヒントにしてストールできる?)のインターセプトをサポートするWARLのフィールドである。
TW==0
のとき、WFI
命令は他に阻害する理由がない限り低い特権モードで実行できる。
TW==1
のとき、WFI
が低い特権モードで実行され、実装固有の制限時間内に完了しなかった場合、WFI
命令は不正命令例外を発生させる。
制限時間が常に0である場合には、WFI
はTW==1
で低い特権モードで実行された際は常に不正命令例外を発生させる。
TW
はMより低い特権モードが無い場合読み込み専用の0になる。
WFI
命令のトラップは、現在のゲストを無駄にアイドルさせることなく、別のゲストOSへ世界をスイッチするのに利用できる。
Sモードが実装されている時、WFI
をUモードで実行すると、実装固有の制限時間内に完了しない場合不正命令例外を発生させる。
この仕様の今後のリビジョンではUモードでのWFI
をSモードで許可する機能を追加する予定である。
そのような機能はTW==0
のときのみアクティブになる。
TSR
(Trap SRET)ビットはスーパーバイザ例外リターン命令SRET
のインターセプトをサポートするWARLのフィールドである。TSR==1
のとき、SモードでのSRET
の実行は不正命令例外を発生させる。TSR==0
のとき、この操作はSモードで許可される。TSR
はSモードがサポートされないとき読み込み専用の0になる。
SRET
のトラップはハイパーバイザ拡張(8章参照)を、それを提供しない実装上でエミュレートするために必要となる。
拡張の充実したサポートはRISC-Vの主要なゴールのひとつであるため、スーパーバイザレベルのOSのような特権モードコードを変更することなく、任意のユーザーモードステート拡張をサポートするための標準インターフェースを定義している。
現在、標準拡張のなかでV拡張のみが浮動小数点数CSRとデータレジスタ以外の追加のステートを定義している。
FS[1:0]
とVS[1:0]
はWARLのフィールドであり、XS[1:0]
は読み込み専用のフィールドである。
これらはコンテキストセーブとリストアのコストを、浮動小数点数ユニットやその他のユーザーモード拡張の現在の状態を設定、トラッキングすることで削減するために使われる。
FS
フィールドは浮動小数点数ユニットの、浮動小数点数レジスタf0
-f31
やCSR fcsr
,frm
, fflags
を含む状態をエンコードするフィールドである。
VS
フィールドはベクタ拡張の、ベクタレジスタv0
-v31
やCSRvcsr
,vxrm
,vxsat
,vstart
,vl
,vtype
,vlenb
を含む状態をエンコードするフィールドである。
XS
フィールドは追加のユーザーモード拡張と関連する状態をエンコードする。
これらのフィールドはコンテキストスイッチルーチンがステートセーブとリストアが必要かどうかを素早く確認するために利用できる。
セーブやリストアが必要ならば、プロセスを達成/最適化するために通常は追加の命令とCSRが必要となる。
この設計は、浮動小数点数ユニットやその他の拡張の状態のセーブ/リストアのためのコンテキストスイッチがほとんどの場合で不要であると想定しており、そのため素早いチェックのためのSD
ビットを提供している。
FS
,VS
,XS
フィールドはすべて同じ表3.3のようなエンコードを使う。
これはOff
, Initial
, Clean
, Dirty
の4状態を表現する。
状態 | FSとVSの意味 | XSの意味 |
---|---|---|
0 | Off | すべてOff |
1 | Initial | DirtyやCleanのものが無く、オンのものがある |
2 | Clean | Dirtyのものが無く、Cleanのものがある |
3 | Dirty | Dirtyのものがある |
F拡張が実装されている場合、FS
フィールドは読み込み専用の0にしてはならない。
F拡張かSモードが実装されていない場合、FS
は読み込み専用の0になる。
Sモードが実装されておりF拡張が実装されていない場合、FS
は読み込み専用の0にしてもよい。
F拡張がなく、Sモードのある実装は許可されているが、その場合にFS
フィールドを読み込み専用の0にすることは要求されていない。
Mモードへの不可視のトラップによるSモードとUモードにおけるF拡張のエミュレーションを有効にするために、実装はFS
フィールドを読み込み専用の0にしない選択をできる。
v
レジスタが実装されているとき、VS
フィールドは読み込み専用の0にしてはならない。
v
レジスタかSモードが実装されていないとき、VS
は読み込み専用の0になる。
Sモードが実装されていてvレジスタが実装されていないとき、VS
は読み込み専用の0にできる。
新しい状態を必要とする追加のユーザ拡張の無いシステムでは、XS
フィールドは読み込み専用の0になる。
状態を持つすべての追加拡張はXS
フィールドと等価なエンコードのCSRを提供する。
XS
フィールドはすべての拡張のサマリを表現する。
各拡張はXS
と異なるエンコーディングを使えるが、XS
フィールドはすべてのユーザ拡張ステータスフィールドの最大の状態値を効率的に報告する。
SD
ビットはFS
,VS
,XS
フィールドの中の、拡張ユーザコンテキストをメモリに保存する必要のあるダーティステートの存在を要約する読み込み専用のビットである。
FS
,XS
,VS
がすべて読み込み専用のゼロならば、SD
も常にゼロである。
拡張の状態がOff
に設定されている時、関連する状態への読み書きは不正命令例外を発生させる。
状態がInitial
の時、関連する状態は初期定数値にすべきである。
状態がClean
の時、関連する状態は初期値ではない可能性があるが、コンテキストスワップで最後にストアされた値とマッチする。
状態がDirty
のとき、関連する状態は最後のコンテキストセーブから変更された可能性がある。
コンテキストセーブの間、その責務を負う特権コードが書き出す必要のあるのは状態がDirty
である関連ステートのみであり、その後拡張の状態をClean
にリセットできる。
コンテキストリストアの間、メモリからロードする必要のあるコンテキストは状態がClean
のもののみである(リストア時にはDirty
にはならない)。
状態がInitial
のとき、セキュリティホールを避けるために、コンテキストリストア時にコンテキストは初期定数値に設定されなければならないが、これはメモリにアクセスすることなく行える。
たとえば、浮動小数点レジスタはすべて即値0で初期化できる。
FS
とXS
フィールドはコンテキストの保存前に特権コードによって読まれる。
FS
フィールドはユーザーコンテキストから復帰する際に特権コードによって直接設定され、XS
フィールドは各拡張のステータスレジスタへの書き込みによって間接的に設定される。
特権モードにかかわらず、ステータスフィールドも命令実行時に更新される。
ユーザーモードISAの拡張はしばしば追加のユーザーモードステートを含み、そのステートはベース整数レジスタよりも大きくなりうる。 拡張は特定のアプリケーションでのみ使われたり、ごく短い期間しか使われないことがある。 パフォーマンスの改善のために、ユーザーモード拡張はユーザーモードソフトウェアがユニットを初期状態にしたりオフにしたりできる追加命令を定義できる。
たとえば、利用前に設定が必要で、利用後は「未設定」状態にできるようなコプロセッサがありうる。
未設定状態はコンテキストセーブに対して初期状態として表現すべきである。
同じアプリケーションが未設定状態から次に設定が行われる(状態をDirty
として設定する)までの間走り続けるとき、設定解除命令で実際に状態を初期化する必要はない。
たとえば、初期状態はコプロセッサの状態を設定解除ごとにおいてではなく、コンテキストリストアにおいて定数で初期化するのみである場合である。
ユニットを無効化しOff
状態にするユーザーモード命令を実行すると、それに続く命令がユニットを有効化する前に利用しようとした際に不正命令例外を発生させる。
ユニットをオンにするユーザーモード命令はユニットの状態を適切に初期化しなければならない。
これはユニットをオンにするまでの間に他のコンテキストがユニットを利用している可能性があるためである。
FS
の設定を変更しても浮動小数点レジスタの状態は変化しない。
特に、FS=Off
は状態を破壊せず、FS=Initial
は内容をクリアしない。
同様に、VS
の設定はベクタレジスタファイルの内容に影響を及ぼさない。
ただし、他の拡張はOff
に設定した際に状態を保持するとは限らない。
実装は、実際に変更が行われていないにもかかわらず状態をDirty
にすることで、浮動小数点レジスタの状態を不正確にトラックすることを選択できる。
実装によっては、浮動小数点レジスタの状態を変えない命令が状態をInitial
やClean
からDirty
に変えることがありうる。
また他の実装では、dirtinessをまったくトラックせず、有効なFS
の状態をOff
とDirty
のみにして、FS
にInitial
やClean
を設定するとDirty
になるようにできる。
このFS
の定義はFSを間違った予測によってDirty
にすることを禁止していない。プラットフォームはサイドチャネルのポテンシャルを閉ざすためにFSに投機的に書き込むことを禁止できる。
命令が明示的/暗黙的に浮動小数点レジスタやfcsr
へ書き込みを行ったがその内容が変わらず、かつFS=Initial
またはFS=Clean
のとき、FS
がDirtyになるかどうかは実装依存である。
実装はベクタレジスタのdirtinessを、ソフトウェアがVS=initial
やVS=Clean
に設定しようとしたときにVS
をDirty
にすることを含め、不正確な方法でトラックすることを選択できる。
VS=Initial
またはVS=Clean
のとき、ベクタレジスタやベクタCSRへの書き込みがあったがその内容が変化しなかった際にVS
がDirty
になるかどうかは実装依存である。
表3.4はFS
,VS
,XS
状態ビットの可能なすべての状態遷移である。
標準浮動小数点数とベクタ拡張はユーザーモード設定解除や無効化/有効化命令をサポートしないことに注意。
拡張の状態を初期化、保存、リストアする標準特権命令は、状態を等価的オブジェクトとして扱うことで追加拡張の詳細を特権コードから隠蔽するために提供される。
多くのコプロセッサ拡張は、ソフトウェアが利用終了時に安全に設定解除や無効化を行えるような制限されたコンテキストでのみ使われる。 これによって大きなステートフルコプロセッサのコンテキストスイッチのオーバーヘッドが削減される。 仕様は浮動小数点の状態を他の拡張の状態から分離している。 これは浮動小数点ユニットが存在するとき浮動小数点レジスタは標準呼び出し規約の一部であり、ユーザーモードソフトウェアは浮動小数点ユニットを安全に無効化できるか知ることができないからである。
XS
フィールドはすべての追加拡張ステートの要約を提供するが、コンテキストセーブとリストアのオーバーヘッドをさらに削減するために追加のマイクロアーキテクチャビットを持つこともできる。
SD
ビットは読み込み専用であり、FS
, VS
, XS
ビットのどれかひとつでもDirtyのときにセットされる(SD=((FS == 11) || (XS == 11) || (VS == 11))
)。
これによって特権コードは整数レジスタやPC以上に追加のコンテキストセーブが必要かどうかを素早く判断できる。
浮動小数点ユニットステートは常に標準命令を使って初期化、保存、復元され(F,D, and/or Q)、特権コードは各fレジスタを保持するための適切な領域を判断するためにFLENに気をつけなければならない。
マシンモードとスーパーバイザモードはFS
, VS
, XS
ビットのコピーを共有する。
スーパーバイザレベルソフトウェアは通常、FS
, VS
, XS
ビットをスーパーバイザレベルで保存されるコンテキストを記録するために直接利用する。
マシンレベルソフトウェアは拡張の状態のセーブとリストアを、それらに対応するコンテキストのバージョンにおいてより保守的に行わなくてはならない。
合理的に考えられるあらゆるユースケースにおいて、ユーザーレベルとハイパーバイザレベルの間のコンテキストスイッチの数は他の権限レベルへのコンテキストスイッチよりもはるかに多いはずである。 コプロセッサは非同期例外を提供するために、その非同期例外がユーザレベルコンテキストスワップを引き起こさない限り、コンテキストのセーブとリストアを行う必要はない。