プロセッサ間割り込み

この機能はハードウェアサポートがあることを前提である。一方のCPUで発生したイベントを他のCPUに通知するために利用される。現在利用されているCPU間割り込みには以下のようなものがある。

  • 再スケジューリング要求(smp_send_reschedule関数)
    • 指定されたCPUへ、プロセスの再スケジューリング要求を出す (send_IPI_mask関数)。
    • 割り込み受信CPU側では、smp_reschedule_interrupt関数が 呼び出される。この関数では特に何もせずに即リターンする。 しかし、その割り込み処理からの戻りでプリエンプション処理が 自動的に動作するため目的は達成される。
  • TLBフラッシュ要求(flush_tlb_others関数)
    • 指定されたCPUへ、指定されたTLBのフラッシュ要求を出す。 (send_IPI_mask関数)。あるCPU上で仮想空間の状態を変更したとき、 他のCPUでも同じ空間を参照している場合、その状態変更を 通知する必要がある。メモリ上のPTEを変更しても、CPU内の TLBの情報は更新されない。
    • 割り込み受信CPU側では、smp_invalidate_interrupt関数が 呼び出される。この関数では指定された領域に対応するTLBの フラッシュを行う。
    • CPU間割り込みを利用したTLBフラッシュ処理は非常に重いため、 無駄に呼び出さないようにしている。 空間管理構造体struct_mmのcpu_vm_maskメンバに、この空間が どのCPUから参照されているかを保持し、そのCPU(CPU群)に 対してのみ割り込みを送る。
  • TLBフラッシュ要求(flush_tlb_all関数)
    • 他のCPU全てへ、TLBフラッシュ要求を出す(smp_call_function関数)。 送信先のCPU上でTLBフラッシュが完了するまでビジーウェイトする。
    • 割り込み受信CPU側では、flush_tlb_all_ipi関数が呼び出され、 TLBのフラッシュを行う。
  • CPU停止要求(smp_send_stop関数)
    • 他のCPU全てへ、CPU停止の要求を行う(smp_call_function関数)。
    • 割り込み受信CPU側では、stop_this_cpu関数が呼び出される。 そのCPUに対する割り込みを禁止し、CPUを停止させる。
  • CPU起動要求
    • IntelCPUの場合、二つ目以降のCPUの起動にプロセッサ間割り込みを 利用している。

 

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1