2026/02/07

MC68020/68030プログラミングクイズの解答と解説

 Xで出題した問題の解答と解説です。Xのポスト

問題

 MC68020/68030のNOP命令には「何もしない」や「実行時間がかかる」以外の重要な機能がある。それは何か。

解答

 先行する命令が完了するまで整数パイプラインやバスオペレーションを同期する。

解説

 バスオペレーションの同期についてはメモリ保護をサポートしているOSカーネルの実装で必要になる場合があります。

例として、MC68020の外部MMUでアクセス違反をBERR信号で通知するシステムについて説明します。

カーネルではユーザ空間からカーネル空間にデータをコピーする場面がありますが、ユーザプロセスから渡されたアドレスが不正な場合はアクセス違反によるバスエラー例外が発生します。カーネルの実装ではこのバスエラーをトラップして、メモリコピーを中断する必要があります。

バスエラーを発生する可能性があるメモリアクセスで同期を実行しないと、以下のようなシナリオでカーネルが不正アドレスを参照してpanicします。

 前提として、ユーザ空間からカーネル空間へのコピーがmoves命令で実行され、バスエラー発生時はスタックフレーム上のコンディションコードやレジスタの値を調整してからmoves命令の次の命令に復帰する実装について考えます。実装のイメージとしては以下の通りです。

メモリコピーするループ

  1.  moves命令でユーザ空間とカーネル空間の間でメモリコピー(ループの本体)
  2. dbcc命令でループ実行。Cフラグがセットされていたらループ終了

バスエラーのトラップハンドラ 

バスエラーが発生した命令がmoves命令であった場合、スタックフレームを書き換えて、以下の処理を実行します。

  1. Cフラグをセット
  2. 戻り値を格納するレジスタの値を-1(エラーを示す)に変更
  3. 復帰アドレスをmoves命令の次の命令に変更

問題発生のシナリオ

  1. moves命令でバスエラーが発生
  2. 整数パイプラインが進んでおり、dbcc命令は「ループを実行する」と判定
  3. ループが終了しないため、カーネルアドレス空間でバスエラーが発生
  4. panic

解決方法

moves命令の後にnop命令を挿入しバスオペレーションを同期する。 

補足

以上はソニーのワークステーションNWS-700シリーズで実際に発生したバグとその対策を元にした説明です。30年以上前の記憶に頼って書いているので細部は不正確かもしれませんがイメージはつかめると思います。

0 件のコメント:

コメントを投稿

TangConsoleDCJ11MEMにおける2BSDの誤動作の調査 その3

誤動作の原因の二つ目が判明しました。 符号なし2進数と符号付2進数の比較 後述するSOFUB_MAPの実装に符号なし2進数と符号付2進数を比較しているコードがありました。直接の比較ではありませんでしたが、符号なし整数の値を符号付整数の変数に代入し、その変数と定数を比較していたため...