Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
複数CPU間の通信を実現する仕組みとして、「プロセッサ間割り込み」が提供されています。文字どおり「あるCPUからほかのCPUに対し」割り込みを発生させます。割り込みを利用することで、動作中のCPUに対して非同期的に要求を出すことができます。
プロセッサ間割り込みを利用するためには、ハードウェアのサポートが必要です。最近のx86搭載のPC/AT互換機では、APIC(Advanced Programmable Interrupt Controller)が、そのための機能を提供しています。それ以外のハードウェアでも、最近はこの機能をサポートしているものが多いようです。
APIC搭載のPC/AT互換機用のLinuxでは、プロセッサ間割り込みを発生させる関数として表2-6のようなものを用意しています。これらによって、指定したCPUに対し、指定した要因でプロセッサ間割り込みを発生させることができます。
関数名 | 説明 |
send_IPI_all | 全CPUで割り込みを発生 |
send_IPI_self | 自CPUで割り込みを発生 |
send_IPI_allbutself | 自CPUを除く全CPUで、割り込みを発生 |
send_IPI_mask | 指定したCPU群で割り込みを発生 |
割り込み要因としては、現在3種類を指定できます。プロセッサ間割り込みを受けたCPUでは、その割り込み要因に対応した割り込みハンドラを起動します(表2-7)。
割り込み要求関数 | 割り込みハンドラ | 説明 |
smp_send_reschedule | smp_reschedule_interrupt | プロセス再スケジュール要求 |
flush_tlb_current_task、local_flush_mm、local_flush_page | smp_invalidate_interrupt | TLB無効化要求 |
smp_call_function、on_each_cpu | smp_call_function_interrupt | 任意の関数の呼び出し要求 |
flush_tlb_all | smp_call_function_interrupt経由でdo_flush_tlb_all | 全TLBの無効化要求 |
smp_send_stop | smp_call_function_interrupt経由でsmp_send_stop関数を呼び出す | CPUの停止要求 |