3.4.3 __ipipe_init_early之初始化root domain

news2024/11/23 21:07:12

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客

3.4.3 __ipipe_init_early之初始化root domain

       如下图所示,红框里面的函数当前都是空的,本章还是分析蓝框中的代码片段。

第295行,变量ipd指向了ipipe_root即ipd代表root domain。

第305行,root domain的名字被命名为“Linux”。

第306行,初始化ipd->context_offset变量,详细分析见《3.4.1.1 IPIPE基础数据结构》。

第307行,调用init_stage(ipd)对root domain进行初始化。此函数只要3行,直接在代码里面进行注释如下:

linux/kernel/ipipe/core.c:
static void init_stage(struct ipipe_domain *ipd)
{
//对ipipe_irqdesc irqs[IPIPE_NR_IRQS]数组进行清零操作。
//此数据结构的意义具体见《3.4.1.2 IPIPE对Linux中断号的改造》
	memset(&ipd->irqs, 0, sizeof(ipd->irqs));

    //对互斥量进行初始化
	mutex_init(&ipd->mutex);

//(1) 调用__ipipe_ipis_alloc()完成所有IPI中断的分配
//(2) 调用hook_internal_ipi设置IPIPE_CRITICAL_IPI
	__ipipe_hook_critical_ipi(ipd);
}

arch/arm64/kernel/ipipe.c:
void __ipipe_hook_critical_ipi(struct ipipe_domain *ipd)
{
	__ipipe_ipis_alloc();
	hook_internal_ipi(ipd, IPIPE_CRITICAL_IPI, __ipipe_do_critical_sync);
}

       init_stage最后调用的函数__ipipe_hook_critical_ipi(ipd),里面做了两件事情,需要展开说一下。

  • 调用__ipipe_ipis_alloc()完成所有IPI中断的分配
arch/arm64/kernel/smp.c:
void __ipipe_ipis_alloc(void)
{
	unsigned int virq, ipi;
	static bool done;

	if (done)
		return;

	/*
	 * We have to get virtual IRQs in the range
	 * [ IPIPE_IPI_BASE..IPIPE_IPI_BASE + NR_IPI + IPIPE_OOB_IPI_NR - 1 ],
	 * otherwise something is wrong (likely someone would have
	 * allocated virqs before we do, and this would break our
	 * fixed numbering scheme for IPIs).
	 */
	for (ipi = 0; ipi < NR_IPI + IPIPE_OOB_IPI_NR; ipi++) {
		virq = ipipe_alloc_virq();
		WARN_ON_ONCE(virq != IPIPE_IPI_BASE + ipi);
	}

	done = true;
}

        根据《3.4.1.2 IPIPE对Linux中断号的改造》的分析,NR_IPI等于7,IPIPE_OOB_IPI_NR等于3,所以for循环调用ipipe_alloc_virq()函数10次,共申请10个virtual interrupt编号。关于virtual interrupt,之前已经总结过了,它的总数量就是IPIPE_NR_VIRQS(64)。为了管理virtual interrupt,IPIPE定义了全局变量 __ipipe_virtual_irq_map,通过位图来标记是否virtual interrupt是否被占用。 

       ipipe_alloc_virq()函数的本质,就是在变量__ipipe_virtual_irq_map的64个bit中,找到第一个为0的bit位(ffz就是find first zero)即空闲的bit位,然后把此bit位设置为1即占用此bit位。从__ipipe_virtual_irq_map中找到的bit位存到变量ipos,必须再加上IPIPE_VIRQ_BASE(1024),才能得到最终的virtual interrupt的编号。

    回到__ipipe_ipis_alloc,它for循环调用ipipe_alloc_virq()函数10次,得到的10个virq是1024~1033. 注意这个范围哦,下一步的IPIPE_CRITICAL_IPI是1031,就在这个范围内!

linux/kernel/ipipe/core.c:
// 共64 bit位,通过位图来标记是否VIRQ是否被占用
static unsigned long __ipipe_virtual_irq_map;

unsigned int ipipe_alloc_virq(void)
{
	unsigned long flags, irq = 0;
	int ipos;

	raw_spin_lock_irqsave(&__ipipe_lock, flags);

	if (__ipipe_virtual_irq_map != ~0) {
		ipos = ffz(__ipipe_virtual_irq_map);
		set_bit(ipos, &__ipipe_virtual_irq_map);
		irq = ipos + IPIPE_VIRQ_BASE;
	}

	raw_spin_unlock_irqrestore(&__ipipe_lock, flags);

	return irq;
}
EXPORT_SYMBOL_GPL(ipipe_alloc_virq);
  • 调用hook_internal_ipi设置IPIPE_CRITICAL_IPI

        IPIPE_CRITICAL_IPI是OOB IPI之一,它对应的virq编号是1031。上一步已经把1031分配出来了,hook_internal_ipi就是来设置IPIPE_CRITICAL_IPI对应的中断处理程序为__ipipe_do_critical_sync()!具体这个函数的用处,后面的章节再分析。

arch/arm64/kernel/ipipe.c:
static inline void
hook_internal_ipi(struct ipipe_domain *ipd, int virq,
		  void (*handler)(unsigned int irq, void *cookie))
{
	ipd->irqs[virq].ackfn = NULL;
	ipd->irqs[virq].handler = handler;
	ipd->irqs[virq].cookie = NULL;
	/* Immediately handle in the current domain but *never* pass */
	ipd->irqs[virq].control = IPIPE_HANDLE_MASK|IPIPE_STICKY_MASK;
}

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 内存分配和回收规则

文章目录 垃圾回收机制堆空间的基本结构内存分配和回收规则对象优先在 Eden 区分配分配担保机制 大对象直接进入老年代长期存活的对象进入老年代主要进行 GC 的区域部分收集 (Partial GC)&#xff1a;Minor GCMajor/Old GCMixed GC 整堆收集&#xff08;Full GC&#xff09; 空…

K-means 算法的介绍与应用

目录 引言 K-means 算法的基本原理 表格总结&#xff1a;K-means 算法的主要步骤 K-means 算法的 MATLAB 实现 优化方法与改进 K-means 算法的应用领域 表格总结&#xff1a;K-means 算法的主要应用领域 结论 引言 K-means 算法是一种经典的基于距离的聚类算法&#xff…

中秋献礼!2024年中科院一区极光优化算法+分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测

中秋献礼&#xff01;2024年中科院一区极光优化算法分解对比&#xff01;VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测 目录 中秋献礼&#xff01;2024年中科院一区极光优化算法分解对比&#xff01;VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测效果一览基本介…

人工智能和大模型的简介

文章目录 前言一、大模型简介二、大模型主要功能1、自然语言理解和生成2、文本总结和翻译3、文本分类和信息检索4、多模态处理三、大模型的技术特性1、深度学习架构2、大规模预训练3、自适应能力前言 随着技术的进步,人工智能(Artificial Intelligence, AI)和机器学习(Mac…

TryHackMe 第1天 | Introduction to Cyber Security

偶然之间了解到了TryHackMe这个网站&#xff0c;尝试跟着其中的学习路径进行学习&#xff0c;发现还是挺适合入门网络安全这一领域的。但是这个网站包含了很多内容&#xff0c;如果不用一些东西记录下来&#xff0c;那么很容易忘记&#xff0c;所以打算在此记录一下学习过程。 …

Linux——应用层自定义协议与序列化

目录 一应用层 1再谈 "协议" 2序列化与反序列化 3理解read,write,recv,send 4Udp vs Tcp 二网络版本计算器 三手写序列和反序列化 四进程间关系与守护进程 1进程组 1.1什么是进程组 1.2组长进程 2会话 2.1什么是会话 2.2会话下的前后台进程 3作业控…

nginx实现权重机制(nginx基础配置二)

在上一篇文章中我们已经完成了对轮询机制的测试&#xff0c;详情请看轮询机制。 接下来我们进行权重机制的测试 一、conf配置 upstream backServer{ server 127.0.0.1:8080 weight2; server 127.0.0.1:8081 weight1; } server { listen 80; server_name upstream.boyatop.cn…

一个有趣的“苦无”测试探针笔的设计

设计思路来源 动漫火影中的苦无&#xff0c;在测试过程中多种测试点方便测试&#xff0c;不想每次去找合适的测试工具&#xff0c;例如点测试和连接线测试需要用到不同的接触工具。 PCB设计 这这些焊点都是短接的&#xff08;除了中间的固定孔&#xff09;&#xff0c;直接使…

Leetcode 验证回文串

使用双指针技术&#xff0c;逐步比较字符串中的字符&#xff0c;并忽略非字母数字字符以及大小写&#xff0c;判断该字符串是否为回文。以下是详细解释&#xff1a; 1. 核心思想&#xff1a; 回文串是指正读和反读都相同的字符串。我们需要从字符串的两端开始比较字符&#x…

Python画笔案例-051 绘制赵爽弦图

1、绘制赵爽弦图 通过 python 的turtle 库绘制 赵爽弦图&#xff0c;如下图&#xff1a; 2、实现代码 绘制 赵爽弦图&#xff0c;以下为实现代码&#xff1a; """赵爽弦图.py本程序演录了如何自定义形状&#xff0c;如何把它添加到造型字典。赵爽弦图是用来证明…

JAVA算法数据结构第一节稀疏矩阵

一、稀疏矩阵介绍&#xff1a; 稀疏矩阵是一种特殊类型的矩阵&#xff0c;其中大部分元素都是零。在处理这类矩阵时&#xff0c;如果仍然使用标准的矩阵存储方式&#xff08;即传统的二维数组&#xff09;&#xff0c;则会浪费大量的存储空间来保存零值。为了提高存储效率以及…

9.12 TFTP通信

客户端设计&#xff08;仅供参考&#xff09;&#xff1a; 下载本质&#xff1a;读取服务器发送的数据包&#xff0c;写入到本地文件 上传本质&#xff1a;读取本地文件内容&#xff0c;发送给服务器。 1、建立菜单选项&#xff0c;上传和下载。 2、上传功能函数&#xff1a; …

实用类工具!分享6款AI论文一键生成器免费8000字

在当前的学术研究和写作领域&#xff0c;AI论文生成工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。千笔-AIPassPaper是一款备受推荐的AI论文一键生成器。 千笔-AIPassPaper是一个一站式…

centos更改静态ip

点击网络和internet设置 点击更改适配器 、点击属性

15.8 在k8s部署prometheus statefulset

本节重点介绍 : 检查&#xff0c;kube-system ns [rootprome-master01 prometheus]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-7d75679df-7f7tx 1/1 Running 0 88m coredns-7d75679df-qmzbg 1/1 Running 0 88m etcd-prome-master01 1/1 Runni…

实习期间git的分枝管理以及最常用的命令

各位找工作实习的友友在工作之前一定要把git的相关知识掌握呀&#xff0c;我实现期间被leader说过关于git规范的相关问题了 目前已更新系列&#xff1a; 当前&#xff1a;:实习期间git的分枝管理以及最常用的命令 Redis高级-----持久化AOF、RDB原理 Redis高级---面试总结5种…

[网络]http请求中的URL,方法,header 和 http响应中的状态码

文章目录 一. http请求1. 认识URLurlencode 2. 认识方法应用场景构造http请求 2. 认识请求报头header 二. http响应1. 状态码 一. http请求 1. 认识URL 我们所说的"网址", 其实就是URL(Uniform Resource Locator 统⼀资源定位符) 1.协议方案名 常见的有http和http…

微信小程序----日期时间选择器(自定义时间精确到分秒)

目录 页面效果 代码实现 注意事项 页面效果 代码实现 js Component({/*** 组件的属性列表*/properties: {pickerShow: {type: Boolean,},config: Object,},/*** 组件的初始数据*/data: {pickerReady: false,// pickerShow:true// limitStartTime: new Date().getTime()-…

Acrobat 9 安装教程

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

MySQL高可用配置及故障切换

目录 引言 一、MHA简介 1.1 什么是MHA&#xff08;MasterHigh Availability&#xff09; 1.2 MHA的组成 1.3 MHA的特点 1.4 MHA工作原理 二、搭建MySQL MHA 2.1 实验思路 2.2 实验环境 1、关闭防火墙和安全增强系统 2、修改三台服务器节点的主机名 2.3 实验搭建 1、…