首页 > 其他分享 >kernel BUG at arch/x86/kernel/apic/vector.c:174!

kernel BUG at arch/x86/kernel/apic/vector.c:174!

时间:2024-03-21 15:02:06浏览次数:23  
标签:kernel PIC x86 中断 apic vector IO APIC

问题兆芯设备适配ngrayos系统(debian系统4.20.1内核)时,在网口up时系统崩溃。

版本如下:

现象:

经过排查,原因是因为兆芯设备启动参数加了noapic(不加系统无法正常刻录和启动),网口up时中断向量不够分配。

APIC(Advanced Programmable Interrupt Controller)是一种硬件设备,用于处理和管理中断请求(IRQs)的分发和处理。它相对于传统的 PIC(Programmable Interrupt Controller)具有更多的功能和灵活性。

当禁用apic时,(apic 提供高级的中断控制功能),所有的传统中断都会通过 PIC 进行路由,但没有任何机制将它们标记为系统级保留向量。中断可能会分配到任何在线的处理器核心上,而无法在特定的核心上进行设置。这可能会触发 apic_update_vector() 中的 BUG(),因为中断描述符槽位不为空。

为了解决这个问题,在尝试 IO/APIC 初始化之后更新传统向量,并在没有 IO/APIC 可用的情况下将它们标记为系统向量。

方法:

修改这三个文件

arch/x86/kernel/apic/apic.c

arch/x86/kernel/apic/vector.c

arch/x86/include/asm/apic.h

lapic_update_legacy_vectors 函数用于更新传统中断的向量表。如果系统启用了 IO/APIC 并且存在至少一个 IO/APIC,则该函数不执行任何操作直接返回。否则,对于系统中的每个传统中断,除了 PIC_CASCADE_IRQ(级联中断),调用 lapic_assign_legacy_vector 函数为其分配中断向量。

主要目的是确保当 IO/APIC 被禁用时,通过 PIC(Programmable Interrupt Controller)路由的传统中断也能够正确处理,并在中断向量表中标记为传统向量。

vector.c:

apic.c

apic.h

修改之后更换内核,重启系统,问题解决。

标签:kernel,PIC,x86,中断,apic,vector,IO,APIC
From: https://blog.csdn.net/qq_45389769/article/details/136908176

相关文章

  • 从时间复杂度的角度出发,list和vector之间查找,插入,删除等数据操作的区别
    list和vector是STL(标准模板库)中常用的两种序列容器,它们各自在不同类型的操作上有着不同的优势。下面是list和vector在不同操作上的擅长之处:list的擅长操作插入和删除操作:list是一个双向链表,插入和删除元素时只需要调整相邻节点的指针,因此在中间或任意位置插入或删除元素时效率很......
  • 深入解析Java中的Vector集合类!
      咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及JavaSE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~......
  • Hadoop与Spark的x86和ARM混合集群部署【环境搭建篇】
    ​笔者在完成课程设计时,突然想到把大数据框架同时部署到PC端虚拟机以及ARM架构的Linux板上,这篇博客记录集群部署流程以及例程测试。部署架构如下图:若下文与架构图冲突,则以架构图为准。运行环境:PC方面,使用两台Ubuntu20.04LTSFocalFossa虚拟机ARM板子则使用香橙派5(R......
  • vector的Erase相关
    vector<int>Vect; Vect.insert(Vect.begin()+2,50); for(autoit=Vect.begin();it!=Vect.end();++it) { if(*it==50) { Vect.erase(it); } }为什么以上的代码会报错,而下面的一段代码不会报错? vector<int>Vect;Vect.insert(Vect.begin()+2,50);......
  • STL:vector中如何使用at()来避免程序报错
     #include<iostream>#include<vector>usingnamespacestd;intmain(){ vector<int>Vec; for(inti=0;i<30;i++) { Vec.push_back(i); //cout<<Vec.size()<<endl; //cout<<Vec.capacity()<......
  • Ubuntu安装pg15和pgvector
    Ubuntu安装pg15,添加源echo"debhttp://apt.postgresql.org/pub/repos/aptfocal-pgdgmain">/etc/apt/sources.list.d/pgdg.listwget--quiet-O-https://www.postgresql.org/media/keys/ACCC4CF8.asc|sudoapt-keyadd-apt-getupdatesudoaptinsta......
  • vector的使用
    前言前两期我们对STL和string的使用进行了介绍并对string进行了模拟实现!本期我们接着来对STL的vector进行学习!本期内容介绍什么是vector?vector常用的接口什么是vector?通过官方文档可以很清楚的看到,vector是一个可变长的顺序表!这就意味着它可以支持扩容等一系列操作!......
  • Vector Quantization
    VectorQuantizationQuantization(量化)Definition:aprocessofrepresentingalarge–possiblyinfinite–setofvalueswithamuchsmallerset.WidelyUsedinLossyCompressionRepresentcertainimagecomponentswithfewerbits(compression)Withunavoidab......
  • 发布 VectorTraits v2.0(支持 x86的Sse系列指令集等)
    目录支持x86的Sse系列指令集为Vector128/Vector256补充全部的向量方法提供CPU型号信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:ArmCPUonMacOS提供所支持的指令集信息结果范例1:X86CPUonWindows结果范例2:ArmCPUonLinux结果范例3:Arm......
  • 【c++】vector
    vector的介绍及使用1.vector的介绍https://cplusplus.com/reference/vector/vector/vector是表示可变大小数组的序列容器就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以......