OSとハードウェア
上のRISC-Vのコードの最後のecall命令が実行されたときに起こることとして正しいものはどれか。
li a7, 64 # システムコールの番号
li a0, 1 # 引数1
la a1, msg # 引数2
li a2, 13 # 引数3
ecall
- A指定した番号のアドレスへ、特権モードのまま通常の関数呼び出しとして分岐する
- B割り込みが禁止され、次の割り込みが来るまでCPUが停止する
- C例外で特権モードに切り替わり、カーネルの処理が実行される
答えと解説を見る
正解:C. 例外で特権モードに切り替わり、カーネルの処理が実行される
ecallは、意図的に例外を起こす命令です。CPUは現在の命令のアドレスを保存し、特権の高いモードに切り替えて、OSが設定した例外の処理の入口へ進みます。カーネルはa7の番号でどのシステムコールかを判断し、a0〜a2を引数として処理して、結果を返したあとユーザモードに戻ります。ユーザモードから直接カーネルの関数へ分岐はできず、CPUを停止させるのはwfiのような別の命令です。
- A. ユーザモードのまま分岐はせず、例外でモードを切り替えます。
- B. CPUを止めて割り込みを待つのはwfiなどの別の命令です。
- C. 正しい。例外で特権モードに入り、カーネルが処理します。