Xで出題した問題の解答と解説です。Xのポスト
問題
MC68020/68030のNOP命令には「何もしない」や「実行時間がかかる」以外の重要な機能がある。それは何か。
解答
先行する命令が完了するまで整数パイプラインやバスオペレーションを同期する。
解説
バスオペレーションの同期についてはメモリ保護をサポートしているOSカーネルの実装で必要になる場合があります。
例として、MC68020の外部MMUでアクセス違反をBERR信号で通知するシステムについて説明します。
カーネルではユーザ空間からカーネル空間にデータをコピーする場面がありますが、ユーザプロセスから渡されたアドレスが不正な場合はアクセス違反によるバスエラー例外が発生します。カーネルの実装ではこのバスエラーをトラップして、メモリコピーを中断する必要があります。
バスエラーを発生する可能性があるメモリアクセスで同期を実行しないと、以下のようなシナリオでカーネルが不正アドレスを参照してpanicします。
前提として、ユーザ空間からカーネル空間へのコピーがmoves命令で実行され、バスエラー発生時はスタックフレーム上のコンディションコードやレジスタの値を調整してからmoves命令の次の命令に復帰する実装について考えます。実装のイメージとしては以下の通りです。
メモリコピーするループ
- moves命令でユーザ空間とカーネル空間の間でメモリコピー(ループの本体)
- dbcc命令でループ実行。Cフラグがセットされていたらループ終了
バスエラーのトラップハンドラ
バスエラーが発生した命令がmoves命令であった場合、スタックフレームを書き換えて、以下の処理を実行します。
- Cフラグをセット
- 戻り値を格納するレジスタの値を-1(エラーを示す)に変更
- 復帰アドレスをmoves命令の次の命令に変更
問題発生のシナリオ
- moves命令でバスエラーが発生
- 整数パイプラインが進んでおり、dbcc命令は「ループを実行する」と判定
- ループが終了しないため、カーネルアドレス空間でバスエラーが発生
- panic
解決方法
moves命令の後にnop命令を挿入しバスオペレーションを同期する。
補足
以上はソニーのワークステーションNWS-700シリーズで実際に発生したバグとその対策を元にした説明です。30年以上前の記憶に頼って書いているので細部は不正確かもしれませんがイメージはつかめると思います。
0 件のコメント:
コメントを投稿