2012-07-09 37 views

Trả lời

3

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.

+0

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

+2

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

+0

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

2

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.

+4

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

+0

@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

1

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:

http://lwn.net/Articles/380931/

http://lwn.net/Articles/302043/

0

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).

0

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.

+1

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

Các vấn đề liên quan