Request irq和setup irq的區別

2021-06-09 22:18:16 字數 1408 閱讀 3655

linux 核心提供了兩個註冊中斷處理函式的介面:setup_irq和request_irq。這兩個函式都定義在kernel/irq/manage.c裡。這兩個函式有什麼樣的區別呢?

(1)setup_irq,setup_irq通常用在系統時鐘(gp timer)驅動裡,註冊系統時鐘驅動的中斷處理函式。下面舉個列子,如s3c2410 timer驅動結構體定義在time.c (arch/arm/plat-s3c)

static struct irqaction s3c2410_timer_irq = ;

然後再定義中斷過程:

下面做個小試驗,將s3c2410 timer驅動的setup_irq那行去掉,改為用request_irq註冊,編譯執行。結果:核心掛掉。為什麼呢?很明顯,系統時鐘驅動中斷不能用request_irq註冊,我們來分析一下原因。看看request_irq和setup_irq 還有哪些細節不一樣?仔細觀察後注意到request_irq內有這麼一行**:action = kmalloc(sizeof(struct irqaction), gfp_atomic);作用為動態建立乙個irqaction。kmalloc實際上也是使用的slab機制進行分配的。原始碼如下:

/* include/linux/slab.h */

static inline void *kmalloc(size_t size, gfp_t flags)

found:

return kmem_cache_alloc((flags & gfp_dma) ?

malloc_sizes[i].cs_dmacachep :

malloc_sizes[i].cs_cachep, flags);

}return __kmalloc(size, flags);

}使用slab機制分配記憶體必須先對slab進行初始化,包括mem_init和kmem_cache_init。我們來看看kernel的初始化流程:/* init/main.c */

asmlinkage void __init start_kernel(void)

time_init函式在mem_init和kmem_cache_init之前被呼叫,而time_init會呼叫體系結構相關部分系統時鐘驅動的初始化函式。time_init最終會呼叫s3c64xx_timer_init函式,進行s3c2410時鐘驅動的初始化和註冊中斷處理函式。現在我們搞清楚了,我們大概的估計是系統時鐘驅動(gp timer driver)的中斷處理函式不能用request_irq註冊是因為request_irq內會呼叫kmalloc動態分配記憶體建立timer的irqaction結構體。而kmalloc是使用的slab記憶體分配機制,使用kmalloc前必須先對kernel的slab以及mem data structure進行初始化。而這部分初始化工作是在系統時鐘驅動初始化之後才進行的,所以造成kmalloc失敗,從而造成系統時鐘驅動的中斷未註冊成功,進而核心掛掉。

Request irq和setup irq的區別

linux 核心提供了兩個註冊中斷處理函式的介面 setup irq和request irq。這兩個函式都定義在kernel irq manage.c裡。internal function to register an irqaction typically used to allocate spe...

Request irq和setup irq的區別

linux 核心提供了兩個註冊中斷處理函式的介面 setup irq和request irq。這兩個函式都定義在kernel irq manage.c裡。internal function to register an irqaction typically used to allocate spe...

Request irq和setup irq的區別

linux 核心提供了兩個註冊中斷處理函式的介面 setup irq和request irq。這兩個函式都定義在kernel irq manage.c裡。internal function to register an irqaction typically used to allocate spe...