问题兆芯设备适配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