เคอร์เนลของ Linux จัดการ IRQ ที่แชร์ได้อย่างไร
ตามที่ฉันได้อ่านจนถึง "เมื่อเคอร์เนลได้รับการขัดจังหวะตัวจัดการที่ลงทะเบียนทั้งหมดจะถูกเรียกใช้" ฉันเข้าใจว่าตัวจัดการที่ลงทะเบียนสำหรับ IRQ แต่ละตัวสามารถดูได้ผ่านทาง/proc/interruptsและฉันยังเข้าใจว่าตัวจัดการที่ลงทะเบียนนั้นมาจากไดรเวอร์ที่เรียกใช้การrequest_irqส่งผ่านในรูปแบบการติดต่อกลับโดยประมาณ: irqreturn_t (*handler)(int, void *) จากสิ่งที่ฉันรู้ควรเรียกใช้ตัวจัดการอินเทอร์รัปต์เหล่านี้ที่เกี่ยวข้องกับ IRQ เฉพาะและขึ้นอยู่กับตัวจัดการเพื่อพิจารณาว่าควรจัดการอินเทอร์รัปต์จริงหรือไม่ IRQ_NONEถ้าจัดการไม่ควรจัดการกับการขัดจังหวะโดยเฉพาะอย่างยิ่งจะต้องกลับแมโครเคอร์เนล สิ่งที่ฉันมีปัญหาในการทำความเข้าใจคือคาดว่าไดรเวอร์แต่ละตัวจะตัดสินว่าควรจัดการกับอินเทอร์รัปต์หรือไม่ ฉันคิดว่าพวกเขาสามารถติดตามภายในถ้าพวกเขาควรจะคาดหวังว่าการขัดจังหวะ ถ้าเป็นเช่นนั้นฉันไม่รู้ว่าพวกเขาจะสามารถรับมือกับสถานการณ์ที่ไดรเวอร์หลายตัวที่อยู่เบื้องหลัง IRQ เดียวกันคาดว่าจะเกิดการขัดจังหวะได้อย่างไร เหตุผลที่ฉันพยายามเข้าใจรายละเอียดเหล่านี้ก็เพราะฉันยุ่งกับkexecกลไกในการเรียกใช้เคอร์เนลอีกครั้งในระหว่างการทำงานของระบบในขณะที่เล่นด้วยหมุดรีเซ็ตและรีจิสเตอร์ต่าง ๆ บนสะพาน PCIe เช่นเดียวกับ PCI ดาวน์สตรีม เครื่อง และในการทำเช่นนั้นหลังจากรีบูตฉันอาจได้รับความตื่นตระหนกของเคอร์เนลหรือไดรเวอร์อื่น ๆ บ่นว่าพวกเขาได้รับการขัดจังหวะแม้ว่าจะไม่มีการดำเนินการเกิดขึ้น ผู้จัดการตัดสินใจว่าควรจัดการกับอินเทอร์รัปต์อย่างไรจึงเป็นเรื่องลึกลับ แก้ไข: ในกรณีที่เกี่ยวข้องกับสถาปัตยกรรม CPU ที่เป็นx86ปัญหา