Kernel硬體中斷的初始化流程

2021-05-25 00:03:38 字數 1855 閱讀 1083

kernel硬體中斷的初始化流程

porting kernel到乙個全新的開發板時,通常hardware irq的初始化函式是要我們自己實現的。

那我們實現了自己硬體的中斷初始化函式之後,核心是如何呼叫到它的呢?核心有自己的一套支援多平台的架構。

下面我們分析核心中斷初始化的過程以及如何呼叫到乙個新平台的irq初始化函式。

這裡我們以s3c2410平台為例,他的中斷初始化函式定義在:

/* arch/arm/mach-s3c2410/irq.c */

void __init s3c24xx_init_irq(void)

在arch/arm/mach-s3c2410/mach-smdk2410.c內通過machine_start巨集將s3c24xx_init_irq賦值給mach_desc結構體的.init_irq成員。

machine_start(smdk2410, "smdk2410") /* @todo: request a new identifier and switch

* to smdk2410 */

/* maintainer: jonas dietsche */

.phys_io = s3c2410_pa_uart,

.io_pg_offst = (((u32)s3c24xx_va_uart) >> 18) & 0xfffc,

.boot_params = s3c2410_sdram_pa + 0x100,

.map_io = smdk2410_map_io,

.init_irq = s3c24xx_init_irq,

.init_machine = smdk_machine_init,

.timer = &s3c24xx_timer,

machine_end

注:machine_start巨集的作用是對mach_desc結構體進行初始化。mach_desc裡定義了一些關鍵的體系架構相關的函式。porting kernel到新平台時,這個結構體是非常關鍵的。

init_irq這個成員在系統初始化的時候會被賦值給init_arch_irq全域性變數,如下:

/* arch/arm/kernel/setup.c */

void __init setup_arch(char **cmdline_p)

注:可以看到這裡不僅初始化了init_arch_irq 全域性變數,同時初始化了system_timer,init_machine等全域性變數。這是kernel支援多平台的一種機制。當然這裡system_timer和init_machine我不多描述,有興趣的可以大家自己去看。機制和init_arch_irq大同小異。

init_arch_irq函式指標定義在體系架構無關的arch/arm/kernel/irq.c內

/* arch/arm/kernel/irq.c */

void (*init_arch_irq)(void) __initdata = null;

並且在init_irq函式內會去執行它。

/* arch/arm/kernel/irq.c */

void __init init_irq(void)

那init_irq在**被呼叫呢? 我們猜想肯定是在系統初始化的時會呼叫它。

實際結果也正是,init_irq會在init/main.c裡的start_kernel函式內被呼叫:

asmlinkage void __init start_kernel(void)

這樣,我們定義的新平台irq初始化函式就會在系統啟動時被呼叫,對我們的硬體中斷進行初始化後再去使用它。這裡搞清楚了,再porting其他東西如gp timer driver等到新平台就變得清晰多了。

Kernel硬體中斷的初始化流程

kernel硬體中斷的初始化流程 porting kernel到乙個全新的開發板時,通常hardware irq的初始化函式是要我們自己實現的。那我們實現了自己硬體的中斷初始化函式之後,核心是如何呼叫到它的呢?核心有自己的一套支援多平台的架構。下面我們分析核心中斷初始化的過程以及如何呼叫到乙個新平台...

kernel中bluetooth的初始化

我們大家都知道,android其實是基於linux之上進行執行的。在android系統的執行之初,首先是kernel層的一系列的初始化。今天曉東就先和大家來簡單分析一下在開機之後,kernel中和bluetooth的初始化相關的內容有哪些。我們仍然還是才kernel net bluetooth下面的...

kernel中bluetooth的初始化

我們大家都知道,android其實是基於linux之上進行執行的。在android系統的執行之初,首先是kernel層的一系列的初始化。今天曉東就先和大家來簡單分析一下在開機之後,kernel中和bluetooth的初始化相關的內容有哪些。我們仍然還是才kernel net bluetooth下面的...