linuxカーネルスピンロックと割り込みの知識説明

1901 ワード

一、同時と競争の三つのポイント
1、同時実行ユニットが同時に共有メモリにアクセスすれば競合する
2、競合状態を解決する唯一の方法は、共有リソースの反発アクセスを保証することであり、すなわち、1つの実行ユニットが共有リソースにアクセスする際に、他の実行ユニットがアクセスを禁止される.
3、共有資源にアクセスするコード領域は臨界領域と呼ばれ、臨界領域は何らかの反発機構で保護される必要がある
二、スピンロックの注意事項
1、スピンロックは1種の忙しいロックで、実行臨界領域がロックを獲得していない時、CPUはずっと循環して“テストして設定します”の原子の操作を実行して、ロックの獲得を待って、待機の過程の中でCPUはいかなる仕事をすることはできなくて、だからスピンロックは必ず臨界領域で特に短いことを使うならば、つまり待機時間はとても短くて、さもなくばシステムの性能を下げます
2、スピンロックはシステムにデッドロックが発生することを招き、すなわちスピンロックを獲得した資源が再びこのスピンロックを獲得し、すなわちスピンロックの再帰使用が発生する.
3、スピンロック中にプロセススケジューリングを引き起こす可能性のある関数、例えばcopy_を呼び出すことができないfrom_user,kmalloc(),msleep()など
三、割り込みとタイマー
端末の出所によって内部割り込みと外部割り込みに分けられる
内部割り込み:例えばオペレーティングシステムがユーザー状態からカーネル状態に切り替えるにはCPU内部のソフトウェア割り込みを利用する必要がある
外部割り込みの割り込み元はCPU外部から、外付け機器から要求される
ベクトル割込みと非ベクトル割込み:ベクトル割込みはハードウェアによって割込みプログラムサービス入口アドレスを提供し、非ベクトル割込みはソフトウェアによって割込みサービスプログラム入口アドレスを提供する
SGI:ソフトウェアによって発生した割り込みは、マルチコア間の通信に使用可能であり、一方のCPUはGICのレジスタを書くことによって他方のCPUに割り込みを発生することができる.
SPI:共有の外付け装置は中断して、このような外付け装置の中断はいかなるCPUにルートすることができます
前半部と後半部:割り込みはカーネルのスケジューリングと正常な動作を中断し、システム性能に影響を与えるため、割り込みの実行時間はできるだけ短くしなければならないが、割り込みの中でいくつかの遅延操作を行わなければならない場合があるため、linuxは割り込み処理プログラムを2つの半部、前半部と後半部に分けている.
上半分は緊急のハードウェア操作、下半分は遅延時間操作
中断された申請と釈放
ローハーフメカニズム
linuxの低半部メカニズムは主にtaklet,ワークキュー,ソフト割り込み,スレッド話irqによる
taskletは低半部処理割り込みプログラムとして
void xxx_do_tasklet(unsight long);
DSCLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0)
 
void xxx_do_tasklet(unsighned long)
{

}
 
irqreturn_t xxx_interrupt(int irq,void *dev_id)
{
........
     tasklet_schedule(&xxx_tasklet);
}

int __init xxx_init(void)
{
    result = request_irq(xxx_irq,xxx_interrupt,0,"xxx",NULL);
}
void __exit xxx_exit(void){
    free_irq(xxx_irq,xxx_interrupt);
}

まとめ:下半部割込みの処理関数taskletは一般的に上半部にtasklet_を通過するschedule()関数スケジューリングは、適切なタイミングで実行されます.スケジューリング関数を実行すると、低半部処理関数はデバイスの低半部実行キューに掛けられます.
ソフトブレークは低半分を中断する処理メカニズムにすぎない