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初始化中断,包括中断栈的初始化,中断控制器的初始化
-
init_irq_stacks:分配per cpu中断栈。此处定义了CONFIG_VMAP_STACK,则中断栈将从vmalloc区域分配,每个cpu的中断栈指针将保存在全局per-cpu变量irq_stack_ptr中
-
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)) \
= {

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

被折叠的 条评论
为什么被折叠?



