Ai đó có thể giải thích cho tôi điều gì xảy ra bên trong một dịch vụ gián đoạn thường xuyên (mặc dù nó phụ thuộc vào thói quen cụ thể, một lời giải thích chung là đủ)? Điều này luôn luôn được sử dụng là một hộp đen cho tôi.Điều gì sẽ xảy ra trong một dịch vụ gián đoạn thường xuyên?
Trả lời
Có một trang wikipedia tốt trên interrupt handlers.
"Trình xử lý ngắt, còn được gọi là thường trình dịch vụ gián đoạn (ISR), là chương trình con gọi lại trong hệ điều hành hoặc trình điều khiển thiết bị có thực thi được kích hoạt bởi việc ngắt ngắt. các hàm khác nhau dựa trên lý do ngắt được tạo ra và tốc độ xử lý ngắt của nó hoàn thành nhiệm vụ của nó. "
Về cơ bản khi một phần cứng (phần cứng ngắt) hoặc một số tác vụ hệ điều hành (phần mềm gián đoạn) cần chạy nó sẽ kích hoạt ngắt. Nếu các ngắt này không bị che khuất (bỏ qua) hệ điều hành sẽ ngừng hoạt động của nó và gọi một số mã đặc biệt để xử lý sự kiện mới này.
Một ví dụ điển hình là đọc từ ổ cứng. Ổ đĩa chậm và bạn không muốn hệ điều hành của mình đợi dữ liệu quay trở lại; bạn muốn hệ điều hành đi và làm những việc khác. Vì vậy, bạn thiết lập hệ thống để khi đĩa có dữ liệu được yêu cầu, nó sẽ làm gián đoạn. Trong thường trình dịch vụ ngắt cho đĩa, CPU sẽ lấy dữ liệu đã sẵn sàng và sẽ trả về cho người yêu cầu.
ISR thường cần phải xảy ra nhanh chóng vì phần cứng có thể có bộ đệm giới hạn, bộ đệm sẽ bị ghi đè bởi dữ liệu mới nếu dữ liệu này hiện bị rút đủ nhanh. Cũng rất quan trọng để ISR của bạn hoàn thành nhanh chóng trong khi CPU đang phục vụ một lần ngắt ISR khác sẽ bị che khuất, có nghĩa là nếu CPU không thể nhận được chúng đủ nhanh, dữ liệu có thể bị mất.
Cách tốt nhất để hiểu là tự mình làm một số ví dụ tối thiểu.
Minimal dụ 16-bit
Đầu tiên học cách để tạo ra một hệ điều hành bootloader tối thiểu và chạy nó trên QEMU và phần cứng thực như tôi đã giải thích ở đây: https://stackoverflow.com/a/32483545/895245
Bây giờ bạn có thể chạy trong 16 -bit chế độ thực:
movw $handler0, 0x00
mov %cs, 0x02
movw $handler1, 0x04
mov %cs, 0x06
int $0
int $1
hlt
handler0:
/* Do 0. */
iret
handler1:
/* Do 1. */
iret
này sẽ làm theo thứ tự:
Do 0.
Do 1.
hlt
: ngừng thực hiện
Lưu ý cách xử lý sẽ cho xử lý đầu tiên tại địa chỉ 0
, và một trong những thứ hai tại 4
: đó là một bảng xử lý gọi là IVT, và mỗi mục có 4 byte.
Minimal example that does some IO để hiển thị bộ xử lý.
chế độ Protected
hệ điều hành hiện đại chạy ở chế độ bảo vệ cái gọi là.
Việc xử lý có nhiều tùy chọn hơn ở chế độ này, do đó phức tạp hơn, nhưng tinh thần thì giống nhau.
Xem thêm
câu hỏi liên quan: What does "int 0x80" mean in assembly code?
- 1. Khi xảy ra gián đoạn, điều gì xảy ra với hướng dẫn trong đường ống?
- 2. điều gì sẽ xảy ra khi một chuỗi bị gián đoạn trong khi chặn trên một wait()?
- 3. Điều gì sẽ xảy ra nếu một Dịch vụ được bắt đầu nhiều lần?
- 4. Làm thế nào để lưu sổ đăng ký trên x86_64 cho một dịch vụ gián đoạn thường xuyên?
- 5. Điều gì sẽ xảy ra khi tôi biên dịch?
- 6. Điều gì sẽ xảy ra nếu dịch vụ dữ liệu đám mây Parse không thành công?
- 7. Điều gì sẽ xảy ra nếu bạn không quay trở lại giao dịch trong Hibernate?
- 8. Điều gì sẽ xảy ra nếu bạn biên dịch một tệp java rỗng?
- 9. Sử dụng pin, điều gì sẽ xảy ra?
- 10. Điều gì sẽ xảy ra khi va chạm băm xảy ra trong khóa Từ điển?
- 11. Điều gì sẽ xảy ra nếu đăng ký phân đoạn CS được thay đổi?
- 12. Điều gì sẽ xảy ra nếu tôi ngừng Dịch vụ Windows trong khi đang xử lý yêu cầu WCF?
- 13. Điều gì sẽ xảy ra nếu tôi ReleaseMutex() hai lần?
- 14. Điều gì xảy ra với ứng dụng Android khi cuộc gọi điện thoại làm gián đoạn ứng dụng?
- 15. Nếu không xóa biến ThreadLocal, Điều gì sẽ xảy ra?
- 16. Điều gì sẽ xảy ra khi ném ngoại lệ C++?
- 17. Điều gì sẽ xảy ra với AsyncTasks sau onPause?
- 18. Điều gì sẽ xảy ra sau khi gói bị bắt?
- 19. điều gì sẽ xảy ra nếu php.ini bị thiếu?
- 20. Trong Java, điều gì sẽ xảy ra nếu bạn sử dụng Double.NaN trong một hoạt động?
- 21. Điều gì sẽ xảy ra khi Stack và Heap Collide
- 22. Điều gì sẽ xảy ra khi mongodb hết bộ nhớ?
- 23. Luồng trong C#. Tác vụ gián đoạn
- 24. Điều gì sẽ xảy ra với tác vụ khi nó bị hủy?
- 25. Điều gì sẽ xảy ra khi Java Compiler thấy nhiều chuỗi nối trong một dòng?
- 26. Ngắt gián đoạn là gì?
- 27. Trong Java nếu một sợi bị giết, điều gì sẽ xảy ra với luồng khác?
- 28. điều gì sẽ xảy ra trong scala khi tải các đối tượng mở rộng ứng dụng?
- 29. Điều gì sẽ xảy ra nếu trường tác vụ trong một <form> có thông số?
- 30. Java Thread Pools/Executor Service và wait() s - điều gì sẽ xảy ra với chuỗi chủ đề và nhiệm vụ?