Kernel硬體中斷的初始化流程

來源:互聯網
上載者:User

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)
{
……
cpu_init();
/*
  * Set up various architecture-specific pointers
  */
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
……
}
註:可以看到這裡不僅初始化了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)
{
int irq;
for (irq = 0; irq  NR_IRQS; irq++)
  irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_DELAYED_DISABLE |
   IRQ_NOPROBE;
#ifdef CONFIG_SMP
bad_irq_desc.affinity = CPU_MASK_ALL;
bad_irq_desc.cpu = smp_processor_id();
#endif
init_arch_irq();
}

那init_IRQ在哪裡被調用呢? 我們猜想肯定是在系統初始化的時會調用它。
實際結果也正是,init_IRQ會在init/main.c裡的start_kernel函數內被調用:
asmlinkage void __init start_kernel(void)
{
……
trap_init();
rcu_init();
init_IRQ();
pidhash_init();
clockevents_init();
init_timers();
……
}
這樣,我們定義的新平台irq初始化函數就會在系統啟動時被調用,對我們的硬體中斷進行初始化後再去使用它。這裡搞清楚了,再porting其他東西如GP Timer Driver等到新平台就變得清晰多了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.