CPU có vô hiệu hóa tất cả các ngắt trên CPU cục bộ trước khi gọi trình xử lý ngắt không? Hay nó chỉ vô hiệu hóa đường ngắt cụ thể đó đang được phục vụ?Trình xử lý ngắt có thể được xử lý bởi cùng một trình xử lý ngắt không?
Trả lời
x86 vô hiệu hóa tất cả các ngắt địa phương (trừ NMI tất nhiên) trước khi nhảy vào vector ngắt. Linux thường che giấu ngắt cụ thể và kích hoạt lại phần còn lại của các ngắt (không bị che khuất), trừ khi một cờ cụ thể được chuyển tới đăng ký trình xử lý ngắt. Lưu ý rằng trong khi điều này có nghĩa là trình xử lý ngắt của bạn sẽ không chạy đua với chính nó trên cùng một CPU, nó có thể và sẽ chạy đua với chính nó đang chạy trên các CPU khác trong một hệ thống SMP/SMT.
Bạn có thể vui lòng cung cấp nguồn cho xác nhận quyền sở hữu "x86 vô hiệu hóa tất cả các ngắt cục bộ .. trước khi chuyển sang vectơ ngắt" không? Tôi có trong tài liệu kiến trúc 3 khối lượng tích cực của Intel, và tài liệu 8259A, cũng từ Intel. Tôi không thể tìm thấy bất cứ điều gì nói với tôi rằng ngắt sẽ tự động bị vô hiệu hóa trước khi nhảy vào ngắt vector, tức là tại điểm nhập ISR (thủ tục ngắt/thủ tục ngắt dịch vụ ngắt) – amn
Hành vi HW không nghiêm ngặt - câu hỏi được hỏi trong ngữ cảnh của nền tảng Linux. Hành vi LAPIC có thể lập trình được, nhưng đây là cách Linux lập trình - tất cả đều bị ngắt cùng mức độ ưu tiên, vì vậy nó chặn một thứ khác, nhưng Linux trong phần mềm cho phép ngắt lại rất nhanh ngay cả trước khi trình xử lý ngắt chạy. – gby
Sau đó tôi tìm thấy tham chiếu đến hành vi "x86 HW" mặc định được đề cập, trong "Intel 64 và IA-32 Arch. Hướng dẫn của nhà phát triển phần mềm", tr. 6-10 tập 1: "Nếu một trình xử lý ngắt hoặc ngoại lệ được gọi là thông qua cổng ngắt, bộ xử lý sẽ xóa cờ kích hoạt ngắt (IF) trong thanh ghi EFLAGS để ngăn chặn gián đoạn tiếp theo can thiệp vào việc thực thi trình xử lý." Cảm ơn bạn đã xóa mọi thứ liên quan đến Linux. – amn
Thông thường (ít nhất là trong x86), ngắt gián đoạn ngắt.
Khi nhận được ngắt, phần cứng sẽ thực hiện những việc sau:
1. Lưu tất cả các thanh ghi ở một nơi định trước.
2. Đặt con trỏ lệnh (bộ đếm chương trình AKA) thành địa chỉ của trình xử lý ngắt.
3. Đặt thanh ghi điều khiển ngắt thành giá trị vô hiệu hóa tất cả (hoặc hầu hết) ngắt. Điều này ngăn cản một gián đoạn khác làm gián đoạn việc này.
Một ngoại lệ là NMI (ngắt không thể che dấu) không thể tắt.
Từ phát triển hạt nhân Linux ** Trình xử lý ngắt trong Linux không cần phải reentrant. Khi một trình xử lý ngắt được cho trước đang thực hiện, dòng ngắt tương ứng được che chắn trên tất cả các bộ xử lý, ngăn chặn một ngắt khác trên cùng một dòng khi nhận được. Thông thường, tất cả các ngắt khác được bật, vì vậy các ngắt khác được phục vụ, nhưng dòng hiện tại luôn bị tắt. Do đó, cùng một trình xử lý ngắt không bao giờ được gọi đồng thời để phục vụ gián đoạn lồng nhau. Việc này đơn giản hóa việc viết trình xử lý ngắt của bạn. ** Vì vậy, chỉ có dòng ngắt hiện tại được che dấu. – Harman
@Harman, Điều này có nghĩa rằng chỉ có dòng ngắt hiện tại được đảm bảo để được đeo mặt nạ. Tôi khá chắc chắn việc thực hiện thực tế trên x86 là che giấu tất cả. – ugoren
Vâng, được rồi. Tôi cũng muốn thêm những gì tôi cho là có liên quan.
Trong nhiều trình điều khiển/mã hạt nhân trong thế giới thực, trình xử lý "dưới một nửa" (bh) được sử dụng khá thường xuyên- tasklets, softirqs. Các bh này chạy trong bối cảnh ngắt và có thể chạy song song với các trình xử lý hàng đầu của chúng trên SMP (esp softirq's).
Tất nhiên, gần đây có một động thái (chủ yếu là mã di chuyển từ dự án PREEMPT_RT) về phía đường chính, về cơ bản sẽ loại bỏ cơ chế 'bh' - tất cả trình xử lý ngắt sẽ chạy với tất cả các ngắt bị vô hiệu hóa. Không chỉ vậy, các trình xử lý (có thể) được chuyển thành các luồng hạt nhân - đây là các trình xử lý ngắt được gọi là "luồng".
Tính đến hôm nay, lựa chọn vẫn được để lại cho nhà phát triển- bạn có thể sử dụng kiểu 'th/bh' truyền thống hoặc kiểu luồng.
Ref và chi tiết:
Trích dẫn Intels sở hữu, đáng ngạc nhiên tốt bằng văn bản "Intel® 64 và IA-32 Kiến trúc phát triển phần mềm của Manual", Tập 1, trang 610:
Nếu một ngắt hoặc xử lý ngoại lệ được gọi là qua một cổng ngắt, bộ xử lý xóa cờ kích hoạt ngắt (IF) trong thanh ghi EFLAGS để ngăn chặn các gián đoạn tiếp theo can thiệp vào việc thực thi trình xử lý. Khi một trình xử lý được gọi thông qua một cái bẫy cổng, trạng thái của cờ IF không bị thay đổi.
Vì vậy, chỉ cần rõ ràng - có, hiệu quả CPU "vô hiệu hóa" tất cả các ngắt trước khi gọi trình xử lý ngắt.Được mô tả đúng, bộ vi xử lý chỉ đơn giản là kích hoạt một lá cờ làm cho nó bỏ qua tất cả các yêu cầu ngắt. Ngoại trừ các ngắt không thể che giấu và/hoặc ngoại lệ phần mềm riêng của nó (vui lòng ai đó sửa lỗi cho tôi về điều này, chưa được xác minh).
Chúng tôi muốn ISR là nguyên tử và không ai có thể từ chối ISR. Do đó, An ISR vô hiệu hóa các ngắt cục bộ (tức là ngắt trên bộ xử lý hiện tại) và khi ISR gọi hàm ret_from_intr() (tức là chúng tôi đã hoàn thành ISR), các ngắt được kích hoạt lại trên bộ xử lý hiện tại.
Nếu xảy ra gián đoạn, bộ xử lý khác sẽ được phân phối bởi bộ xử lý khác (trong hệ thống SMP) và ISR liên quan đến ngắt đó sẽ bắt đầu chạy.
Trong hệ thống SMP, Chúng tôi cũng cần bao gồm cơ chế đồng bộ hóa thích hợp (khóa quay) trong ISR.
Bạn có thể vui lòng xây dựng thêm câu trả lời của bạn thêm mô tả chi tiết hơn về giải pháp bạn cung cấp không? – abarisone
- 1. Lập trình AVR, xử lý ngắt
- 2. Trình xử lý ngắt i2c stm32
- 3. Vấn đề với xử lý tín hiệu, xử lý ngắt
- 4. Xử lý ngắt trong Windows
- 5. Các ngắt bị xử lý bởi các máy xử lý kép như thế nào?
- 6. Cách xử lý ngắt Inter Interor
- 7. tín hiệu xử lý trong C - ngắt trong ngắt
- 8. Nhận quy trình đang chạy xử lý được xử lý
- 9. Các ngắt được xử lý như thế nào trên SMP?
- 10. Thẻ dải có javascript và xử lý ngắt dòng
- 11. Trình xử lý sự kiện có được xử lý không đồng bộ không?
- 12. Có yêu cầu spinlock cho mọi trình xử lý ngắt không?
- 13. Trình xử lý ghi nhớ
- 14. SignalR - Xử lý người dùng bị ngắt kết nối
- 15. Delphi có thể được sử dụng để tạo và xử lý một trình xử lý giao thức tùy chỉnh không?
- 16. Trình xử lý là gì
- 17. Trình xử lý vs AsyncTask
- 18. Xử lý vấn đề ngoại lệ chưa được xử lý
- 19. Ngoại lệ chưa xử lý không bị xử lý lỗi Global.asax hoặc trình xử lý lỗi IHttpModule tùy chỉnh
- 20. Bộ vi xử lý Intel và AMD có cùng bộ xử lý không?
- 21. Ctrl + C ngắt sự kiện xử lý trong Linux
- 22. Xử lý một phần tệp bằng bộ tiền xử lý
- 23. Cách xử lý ngắt kết nối máy khách WCF
- 24. Đa xử lý trên các lần ngắt Windows
- 25. Làm thế nào để khai báo một trình xử lý ngắt (ISR) trong Mspgcc?
- 26. PIC có xử lý các ngắt không có khả năng che chắn không?
- 27. Trình xử lý giao thức WebView Android
- 28. Trình duyệt Chrome không hiển thị hình ảnh được tạo bởi trình xử lý HTTP
- 29. Xử lý đúng tài nguyên trình duyệt
- 30. HTTP - 500 org.springframework.web.util.NestedServletException: Xử lý trình xử lý không thành công;
CPU nào? Kiến trúc gì? – eepp
kiến trúc x86. – Harman