中断管理基础学习笔记 - 2.中断控制器初始化

本文详细介绍了Linux内核在ARM架构下如何管理和初始化中断。主要内容包括init_IRQ函数的流程,以及GIC中断控制器的初始化过程。通过对gic_of_init函数的深入分析,揭示了Linux内核中断管理机制的设计思想。

1. 前言

本专题我们开始学习进程管理部分。本文主要参考了《奔跑吧, Linux内核》、ULA、ULK的相关内容。
本节记录ARM架构下中断是如何管理的,Linux内核中的中断管理机制是如何设计与实现的,以及常用的下半部机制,如软中断、tasklet、workqueue等。本文及后续中断相关笔记均以qemu 5.0.0内嵌平台为例,中断控制器采用GIC-400控制器,支持GIC version2技术规范。本文主要以GIC为例记录中断控制器的初始化流程。

kernel版本:5.10
平台:arm64

注:
为方便阅读,正文标题采用分级结构标识,每一级用一个"-“表示,如:两级为”|- -", 三级为”|- - -“

2. init_IRQ

kernel启动流程-start_kernel的执行_1.概述一文介绍start_kernel总体流程的时候有对init_IRQ做过简单的说明,本节将对init_IRQ做详细的介绍

void __init init_IRQ(void)
    |--init_irq_stacks();//CONFIG_VMAP_STACK
    |--irqchip_init();//初始化irq控制器,并注册irq_domain
    |      |  //扫描__irqchip_of_table,匹配DTB中定义的中断控制器,匹配成功则调用中断控制器设置的初始化函数
    |      |--of_irq_init(__irqchip_of_table);
    |      |--acpi_probe_device_table(irqchip);
    |--if (system_uses_irq_prio_masking())
            local_daif_restore(DAIF_PROCCTX_NOIRQ);

init_IRQ初始化中断,包括中断栈的初始化,中断控制器的初始化

  1. init_irq_stacks:分配per cpu中断栈。此处定义了CONFIG_VMAP_STACK,则中断栈将从vmalloc区域分配,每个cpu的中断栈指针将保存在全局per-cpu变量irq_stack_ptr中

  2. irqchip_init:初始化irq控制器,并注册irq_domain,其中of_irq_init扫描__irqchip_of_table,匹配DTB中定义的中断控制器,匹配成功则调用中断控制器设置的初始化函数

|- -of_irq_init

在介绍of_irq_init函数之前,首先要澄清它的参数matches,对应init_IRQ中就是__irqchip_of_table,下面我们来看下__irqchip_of_table的来历:

<include/linux/of.h>

#if defined(CONFIG_OF) && !defined(MODULE)
#define _OF_DECLARE(table, name, compat, fn, fn_type)                   \
        static const struct of_device_id __of_table_##name              \
                __used __section("__" #table "_of_table")               \
                 = {
     
      .compatible = compat,                              \
                     .data = (fn == (fn_type)NULL) ? fn : fn  }
#else
#define _OF_DECLARE(table, name, compat, fn, fn_type)                   \
        static const struct of_device_id __of_table_##name              \
                __attribute__((unused))                                 \
                 = {
     
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值