2010-08-03 31 views

Trả lời

16

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.

0

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.

Minimal example

Xem thêm

câu hỏi liên quan: What does "int 0x80" mean in assembly code?

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