3

Linux カーネルが 2.6.32 より前の ISR スタックとしてスレッド カーネル スタックを使用していることは知っていますが、2.6.32 以降では、カーネルは分離されたスタックを使用します。ISR スタックがいつセットアップ/クレートされるか、ある場合は破棄するか教えてください。または、ソースファイル名と行番号を教えてください。前もって感謝します。

2014 年 10 月 17 日に更新:

Linux にはいくつかの種類のスタックがあります。以下は、私が知っている 3 つの主要な (すべてではない) です。

  1. ユーザー空間プロセス スタック。各ユーザー空間タスクには独自のスタックがあります。これは、タスクの作成時に mmap() によって作成されます。
  2. ユーザー空間タスクのカーネル スタック。ユーザー空間タスクごとに 1 つ。これは do_fork()->copy_process()->dup_task_struct()->alloc_thread_info() 内で作成され、system_call に使用されます。
  3. ハードウェア割り込み用のスタック (上半分)、各 CPU (2.6 以降) に 1 つ、arch/x86/kernel/irq_32.c で定義: DEFINE_PER_CPU(struct irq_stack *, hardirq_stack);do_IRQ() -> handle_irq() -> execute_on_irq_stack() 割り込みスタックを切り替える

これらが正しいかどうか教えてください。

4

1 に答える 1

2

割り込みハンドラには IRQ スタックがあります。割り込みハンドラには 2 種類のスタックが含まれます。

  1. ハードウェア IRQ スタック。
  2. ソフトウェア IRQ スタック。

プロセスごとに割り当てられる通常のカーネル スタックとは対照的に、2 つの追加スタックは CPU ごとに割り当てられます。ハードウェア割り込みが発生する (または softIRQ が処理される) たびに、カーネルは適切なスタックに切り替える必要があります。歴史的に、割り込みハンドラは独自のスタックを受け取りませんでした。代わりに、割り込みハンドラは実行中のプロセスのスタックを共有し、割り込みました。カーネル スタックのサイズは 2 ページです。通常、これは 32 ビット アーキテクチャでは 8KB、64 ビット アーキテクチャでは 16KB です。このセットアップでは割り込みハンドラがスタックを共有するため、スタックに割り当てるデータを非常に節約する必要があります。もちろん、カーネル スタックは最初から制限されているため、すべてのカーネル コードは注意が必要です。

追加のスタックへのポインタは、次の配列で提供されます: arch/x86/kernel/irq_32.c

static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly;
static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;
于 2015-02-28T15:58:20.513 に答える