GNU/Linux >> Linux の 問題 >  >> Linux

Linuxカーネルが割り込みを処理する方法

割り込みは、最新のCPUが機能する方法の重要な部分です。たとえば、キーボードのキーを押すたびにCPUが中断されるため、PCはキーボードからのユーザー入力を読み取ることができます。これは非常に迅速に行われるため、ユーザーエクスペリエンスの変化や障害に気付くことはありません。

さらに、割り込みを引き起こす可能性のあるコンポーネントはキーボードだけではありません。一般に、CPUに割り込みを発生させる可能性のあるイベントには次の3種類があります。ハードウェア割り込みソフトウェア割り込み 、および例外 。さまざまな種類の割り込みに入る前に、いくつかの用語を定義します。

定義

割り込み要求( IRQ )は、プログラマブル割り込みコントローラー( PIC )によって要求されます )CPUに割り込み、割り込みサービスルーチン( ISR )を実行することを目的としています )。 ISRは、IRQの原因に応じて特定のデータを処理する小さなプログラムです。 ISRが終了するまで、通常の処理は中断されます。

以前は、IRQは別のマイクロチップ(PIC)によって処理され、I/OデバイスはPICに直接配線されていました。 PICはさまざまなハードウェアIRQを管理し、CPUと直接通信できました。 IRQが発生すると、PICはデータをCPUに書き込み、割り込み要求( INTR )を発生させました。 )ピン。

現在、IRQは高度なプログラマブル割り込みコントローラー( APIC )によって処理されます。 )、これはCPUの一部です。各コアには独自のAPICがあります。

割り込みの種類

前述したように、割り込みは、そのソースに応じて3つのタイプに分けることができます。

ハードウェア割り込み

ハードウェアデバイスが特定のデータを処理する準備ができていることをCPUに通知する場合(キーボード入力やパケットがネットワークインターフェイスに到着した場合など)、ハードウェアデバイスはIRQを送信して、データが利用可能であることをCPUに通知します。これにより、カーネルの起動時にデバイスドライバーによって登録された特定のISRが呼び出されます。

ソフトウェア割り込み

その他のLinuxリソース

  • Linuxコマンドのチートシート
  • 高度なLinuxコマンドのチートシート
  • 無料のオンラインコース:RHELの技術概要
  • Linuxネットワーキングのチートシート
  • SELinuxチートシート
  • Linuxの一般的なコマンドのチートシート
  • Linuxコンテナとは何ですか?
  • 最新のLinux記事

ビデオを再生するときは、音楽の速度が変化しないように、音楽とビデオの再生を同期させることが不可欠です。これは、正確なタイマーシステム(jiffiesとして知られている)によって繰り返し起動されるソフトウェア割り込みによって実現されます。このタイマーにより、音楽プレーヤーを同期させることができます。ソフトウェア割り込みは、ハードウェアデバイスに対してデータを読み書きするための特別な命令によって呼び出すこともできます。

リアルタイム機能が必要な場合(産業用アプリケーションなど)、ソフトウェア割り込みも重要です。これについて詳しくは、LinuxFoundationの記事組み込み開発者向けのリアルタイムLinuxの概要をご覧ください。 。

例外

例外は、おそらく知っているタイプの割り込みです。 CPUがゼロ除算またはページフォールトを引き起こすコマンドを実行すると、追加の実行は中断されます。このような場合は、ポップアップウィンドウで通知されるか、セグメンテーション違反(コアダンプ)が表示されます。 コンソール出力で。ただし、すべての例外が誤った命令によって引き起こされるわけではありません。

例外はさらに障害に分けることができます 、トラップ 、および中止

  • 障害: 障害は、システムが修正できる例外です。たとえば、プロセスがハードドライブにスワップされたメモリページからデータにアクセスしようとした場合などです。要求されたアドレスはプロセスアドレススペース内にあり、アクセス権は正しいです。ページがRAMに存在しない場合、IRQが発生し、ページフォールト例外ハンドラーが開始されます。 目的のメモリページをRAMにロードします。操作が成功すると、実行が続行されます。
  • トラップ: トラップは主にデバッグに使用されます。プログラムにブレークポイントを設定する場合は、トラップをトリガーする特別な命令を挿入します。トラップは、デバッガーがローカル変数の値を読み取って表示できるようにするコンテキストスイッチをトリガーできます。その後も実行を継続できます。トラップは、システムコールを実行するためのデフォルトの方法でもあります(プロセスの強制終了など)。
  • 中止: 中止は、ハードウェア障害またはシステムテーブルの値の不整合が原因で発生します。アボートは、例外の原因となった命令の場所を報告しません。これらは最も重要な割り込みです。アボートは、システムのアボート例外ハンドラーを呼び出します 、それを引き起こしたプロセスを終了します。
実践する

IRQは、APICのベクトル内の優先度順に並べられています(0 =最高の優先度)。最初の32個の割り込み(0〜31)には、CPUによって指定された固定シーケンスがあります。それらの概要は、OsDevの例外ページにあります。後続のIRQは別の方法で割り当てることができます。割り込み記述子テーブル( IDT )IRQとISR間の割り当てが含まれています。 Linuxは、割り当てに対して0から256までのIRQベクトルを定義します。

システムに登録されている割り込みのリストを印刷するには、コンソールを開いて次のように入力します。

cat /proc/interrupts

次のように表示されます:

左から右に、列は次のとおりです。IRQベクトル、CPUあたりの割り込みカウント(0 .. n )、ハードウェアソース、ハードウェアソースのチャネル情報、およびIRQの原因となったデバイスの名前。

表の下部には、数値以外の割り込みがいくつかあります。これらは、ローカルタイマー割り込み( LOC )のようなアーキテクチャ固有の割り込みです。 )IRQ236上。それらのいくつかはLinuxカーネルソースツリーのLinuxIRQベクトルレイアウトで指定されています。

このテーブルのライブビューを取得するには、次を実行します:

watch -n1 "cat /proc/interrupts"
結論

ハードウェア、ドライバー、およびソフトウェアの適切な相互作用には、適切なIRQ処理が不可欠です。幸いなことに、Linuxカーネルは非常に優れた機能を果たしており、通常のPCユーザーはカーネル全体の割り込み処理についてほとんど気付かないでしょう。

これは非常に複雑になる可能性があり、この記事ではトピックの概要のみを説明します。このテーマをさらに深く掘り下げるための優れた情報源は、 Linux Insideです。 eBook(CC BY-NC-SA 4.0)およびLinuxカーネル教育リポジトリ。


Linux
  1. Linuxカーネルテストのライフサイクル

  2. Linux –カーネルでUser_namespacesを有効にする方法は? (非特権の `unshare`の場合。)?

  3. Linux カーネルが使用するキャッシュを消去する方法

  1. Linuxデスクトップでカーネルをアップグレードする方法

  2. ターミナルでHZを確認するには?

  3. Linux では割り込みはどのように処理されますか?

  1. Linux – Linuxカーネルシステムコールの実装を見つける方法は?

  2. Linux –どのモジュールがカーネルを汚染しているかを判断する方法は?

  3. CからLinuxでPIDによってプロセスのCPU使用率を計算する方法は?