Theo những gì tôi đã đọc cho đến nay, "khi kernel nhận được một ngắt, tất cả các trình xử lý đã đăng ký sẽ được gọi."
Tôi hiểu rằng các trình xử lý đã đăng ký cho mỗi IRQ có thể được xem qua /proc/interrupts
và tôi cũng hiểu rằng các trình xử lý đã đăng ký đến từ các trình điều khiển đã gọi request_irq
đi qua trong một cuộc gọi lại có dạng:
irqreturn_t (*handler)(int, void *)
Dựa trên những gì tôi biết, mỗi lệnh gọi lại của trình xử lý ngắt này được liên kết với IRQ cụ thể sẽ được gọi và tùy thuộc vào trình xử lý để xác định xem ngắt có thực sự được xử lý hay không. Nếu trình xử lý không nên xử lý ngắt cụ thể, nó phải trả về macro kernel IRQ_NONE
.
Điều tôi gặp khó khăn trong việc hiểu là, làm thế nào mỗi tài xế dự kiến sẽ xác định liệu có nên xử lý ngắt hay không. Tôi cho rằng họ có thể theo dõi nội bộ nếu họ dự kiến sẽ bị gián đoạn. Nếu vậy, tôi không biết làm thế nào họ có thể giải quyết tình huống trong đó nhiều tài xế đằng sau cùng một IRQ đang mong đợi một sự gián đoạn.
Lý do tôi cố gắng hiểu các chi tiết này là vì tôi đang rối tung với kexec
cơ chế thực thi lại kernel ở giữa hoạt động của hệ thống trong khi chơi với các chân thiết lập lại và các thanh ghi khác nhau trên cầu PCIe cũng như PCI hạ lưu thiết bị. Và khi làm như vậy, sau khi khởi động lại, tôi cảm thấy hoảng loạn hạt nhân hoặc các trình điều khiển khác phàn nàn rằng họ đang bị gián đoạn mặc dù không có hoạt động nào diễn ra.
Làm thế nào xử lý quyết định rằng ngắt nên được xử lý bởi nó là bí ẩn.
Chỉnh sửa: Trong trường hợp có liên quan, kiến trúc CPU được đề cập là x86
.