2014-10-03 88 views
2

我知道Linux內核在2.6.32之前將線程內核棧作爲ISR棧,在2.6.32之後,內核使用分離棧,如果錯誤請糾正我。 你會告訴我什麼時候ISR堆棧被設置/設置,或者如果有的話會被銷燬。或者告訴我源文件名和行號?提前致謝。Linux內核中的硬件中斷堆棧上半部分?

更新時間2014年10月17日:

有幾種類型的Linux軟件棧的。下面是我知道的3個主要(不是全部)。

  1. 用戶空間處理堆棧,每個用戶空間任務都有自己的堆棧, 這通過創建MMAP()被創建任務時。
  2. 用於用戶空間任務的內核堆棧,用於每個用戶空間任務,這是在do_fork() - > copy_process() - > dup_task_struct() - > alloc_thread_info()中創建並用於system_call的 。
  3. 棧硬件中斷(上半部分),一個用於每個CPU(2.6)之後,在 拱/ 86 /內核/ irq_32.c定義:DEFINE_PER_CPU(struct irq_stack *, hardirq_stack); do_IRQ() - > handle_irq() - > execute_on_irq_stack()開關中斷堆棧

請讓我知道這些是否正確。

回答

2

對於中斷處理程序,有IRQ堆棧。用於中斷處理程序的2種堆棧:

  1. 硬件IRQ堆棧。
  2. 軟件IRQ堆棧。

與每個進程分配的常規內核堆棧相比,兩個附加堆棧是按CPU分配的。無論何時發生硬件中斷(或處理軟IRQ),內核都需要切換到適當的堆棧。歷史上,中斷處理程序沒有收到自己的堆棧。相反,中斷處理程序將共享正在運行的進程的堆棧,它們會中斷。內核堆棧大小爲兩頁;通常,在32位體系結構上是8KB,在64位體系結構上是16KB。因爲在這個設置中,中斷處理程序共享堆棧,所以它們必須非常節約地分配它們分配的數據。當然,內核棧僅限於開始,因此所有內核代碼都應該謹慎。下面陣列中提供

指針到附加堆棧: 拱/ 86 /內核/ irq_32.c

static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly; 
static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;