Sự khác biệt giữa Bẫy và Ngắt là gì?


Câu trả lời:


203

Một cái bẫy là một ngoại lệ trong một quá trình người dùng. Nó gây ra bởi sự phân chia bởi truy cập bộ nhớ bằng 0 hoặc không hợp lệ. Đây cũng là cách thông thường để gọi một thường trình kernel (một cuộc gọi hệ thống ) bởi vì chúng chạy với mức độ ưu tiên cao hơn mã người dùng. Xử lý là đồng bộ (vì vậy mã người dùng bị treo và tiếp tục sau đó). Theo một nghĩa nào đó, chúng "hoạt động" - hầu hết thời gian, mã dự kiến ​​bẫy sẽ xảy ra và dựa vào thực tế này.

Một ngắt là thứ được tạo ra bởi phần cứng (các thiết bị như đĩa cứng, card đồ họa, cổng I / O, v.v.). Chúng không đồng bộ (nghĩa là chúng không xảy ra ở những nơi có thể dự đoán được trong mã người dùng) hoặc "thụ động" do trình xử lý ngắt phải chờ chúng xảy ra cuối cùng.

Bạn cũng có thể thấy một cái bẫy như một loại ngắt bên trong CPU vì trình xử lý cho trình xử lý bẫy trông giống như một trình xử lý ngắt (các thanh ghi và các con trỏ ngăn xếp được lưu, có một chuyển đổi ngữ cảnh, thực thi có thể tiếp tục trong một số trường hợp nó bị tắt) .


5
Thật thú vị khi lxr.free-electrons.com/source/arch/x86/kernel/ Bang chia cho số 0 được khởi tạo như một ngắt phần cứng, tại sao lại như vậy?
Alex Kreimer

8
Bởi vì nó thực sự là một ngắt mà CPU gửi khi ALU tìm thấy vấn đề này. Cũng giống như một lỗi phân khúc. Tuy nhiên, không phải tất cả các lỗi toán học đều gây ra gián đoạn (tràn không).
Aaron Digulla

4
Điều đó có ý nghĩa. Nhưng sau đó, điều hơi khó hiểu là tại sao trong các nhân Linux trước đó, nó được khởi tạo như một cái bẫy phần mềm: set_trap_gate (0, & split_error);
Alex Kreimer

11
Ý bạn là gì, " hơi khó hiểu"? Điều này rất khó hiểu :-) Vấn đề ở đây là chia cho số 0 là một ngắt phần cứng (IRQ / vector 0) nhưng các nhà phát triển kernel có một số lựa chọn về cách xử lý nó. Vì vậy, từ một quá trình người dùng, đó là một cái bẫy nhưng từ phía CPU, đó là một sự gián đoạn. Ai đúng? Không ai? Cả hai?
Aaron Digulla

3
Tất nhiên, điều này chỉ đúng với CPU x86. Các CPU khác hoạt động khác nhau.
Aaron Digulla

110

Bẫyngắt có liên quan chặt chẽ. Bẫy là một loại ngoại lệ và ngoại lệ tương tự như ngắt.

Intel x86 định nghĩa hai loại chồng chéo, các sự kiện được vectơ ( ngắt so với ngoại lệ ) và các lớp ngoại lệ ( lỗi so với bẫy so với hủy bỏ ).

Tất cả các trích dẫn trong bài đăng này là từ phiên bản tháng 4 năm 2016 của Hướng dẫn dành cho nhà phát triển phần mềm Intel . Đối với phối cảnh x86 (dứt khoát và phức tạp), tôi khuyên bạn nên đọc chương của SDM về Xử lý ngắt và ngoại lệ.

Sự kiện véc tơ

Sự kiện véc tơ ( ngắtngoại lệ ) làm cho bộ xử lý nhảy vào một trình xử lý ngắt sau khi lưu nhiều trạng thái của bộ xử lý (đủ để việc thực thi có thể tiếp tục từ thời điểm đó sau đó).

Các ngoại lệ và ngắt có ID, được gọi là vectơ, xác định trình xử lý ngắt nào mà bộ xử lý nhảy tới. Trình xử lý ngắt được mô tả trong Bảng mô tả ngắt.

Ngắt

Ngắt xảy ra tại các thời điểm ngẫu nhiên trong quá trình thực hiện chương trình, để đáp ứng với các tín hiệu từ phần cứng. Phần cứng hệ thống sử dụng các ngắt để xử lý các sự kiện bên ngoài bộ xử lý, chẳng hạn như yêu cầu dịch vụ cho các thiết bị ngoại vi. Phần mềm cũng có thể tạo ra các ngắt bằng cách thực hiện lệnh INT n.

Ngoại lệ

Các ngoại lệ xảy ra khi bộ xử lý phát hiện một điều kiện lỗi trong khi thực hiện một lệnh, chẳng hạn như chia cho 0. Bộ xử lý phát hiện một loạt các điều kiện lỗi bao gồm vi phạm bảo vệ, lỗi trang và lỗi máy bên trong.

Phân loại ngoại lệ

Các ngoại lệ được phân loại là lỗi , bẫy hoặc hủy bỏ tùy thuộc vào cách chúng được báo cáo và liệu hướng dẫn gây ra ngoại lệ có thể được khởi động lại mà không mất chương trình hoặc nhiệm vụ liên tục.

Tóm tắt: bẫy tăng con trỏ lệnh, lỗi không và hủy bỏ 'phát nổ'.

Bẩy

Một cái bẫy là một ngoại lệ được báo cáo ngay sau khi thực hiện lệnh bẫy. Bẫy cho phép thực hiện một chương trình hoặc nhiệm vụ được tiếp tục mà không mất tính liên tục của chương trình. Địa chỉ trả về cho trình xử lý bẫy chỉ đến lệnh được thực hiện sau lệnh bẫy.

Lỗi

Một lỗi là một ngoại lệ thường có thể được sửa chữa và một khi được sửa chữa, cho phép chương trình được khởi động lại mà không mất tính liên tục. Khi có lỗi được báo cáo, bộ xử lý sẽ khôi phục trạng thái máy về trạng thái trước khi bắt đầu thực hiện lệnh bị lỗi. Địa chỉ trả về (nội dung đã lưu của các thanh ghi CS và EIP) cho trình xử lý lỗi chỉ đến lệnh bị lỗi, thay vì chỉ thị theo hướng dẫn lỗi.

Ví dụ: Một lỗi trang thường có thể phục hồi. Một phần không gian địa chỉ của ứng dụng có thể đã được hoán đổi vào đĩa từ ram. Ứng dụng sẽ kích hoạt một lỗi trang khi nó cố truy cập vào bộ nhớ đã bị tráo đổi. Nhân có thể kéo bộ nhớ đó từ đĩa sang ram và điều khiển quay lại ứng dụng. Ứng dụng sẽ tiếp tục ở nơi nó dừng lại (tại hướng dẫn bị lỗi đang truy cập bộ nhớ bị tráo đổi), nhưng lần này truy cập bộ nhớ sẽ thành công mà không bị lỗi.

Huỷ bỏ

Một hủy bỏ là một ngoại lệ mà không phải lúc nào báo cáo vị trí chính xác của các chỉ dẫn gây ra ngoại lệ và không cho phép khởi động lại chương trình hoặc công việc đã gây ra ngoại lệ. Aborts được sử dụng để báo cáo các lỗi nghiêm trọng, chẳng hạn như lỗi phần cứng và các giá trị không nhất quán hoặc bất hợp pháp trong các bảng hệ thống.

Vỏ cạnh

Phần mềm gọi các ngắt (được kích hoạt bởi lệnh INT) hoạt động theo cách giống như bẫy. Lệnh hoàn thành trước khi bộ xử lý lưu trạng thái của nó và nhảy đến trình xử lý ngắt.


6
Đây là một câu trả lời tốt. Tôi rất tích cực, hàng đợi đánh giá "Câu trả lời muộn từ người dùng mới" đã cho tôi một bài kiểm tra để đảm bảo rằng tôi đã chú ý.
Noumenon

1
Cảm ơn! Điều đó có ý nghĩa rất lớn đối với tôi :)
ruthafjord

Đây là một câu trả lời tuyệt vời cho x86. Câu hỏi ban đầu khá chung chung và không đề cập đến x86. Tôi đã thực hiện một chỉnh sửa để cố gắng đạt được sự cân bằng. Có lẽ bạn có thể thêm một đoạn khác ở đầu câu trả lời này để giải quyết câu hỏi về thuật ngữ bên ngoài thế giới x86? Và / hoặc để lại một chỉnh sửa khác cho câu hỏi nếu bạn nghĩ tôi đã làm nó tệ hơn: PI chỉ thực sự biết x86, nhưng hy vọng rằng các hệ thống khác sử dụng thuật ngữ rất giống nhau và bạn chỉ có thể nói rằng :)
Peter Cordes

1
Lướt các PPC cuốn sách aarchitecture, và có vẻ như định nghĩa của chúng được phần lớn chồng chéo. Họ có tên mới cho các trường hợp cạnh và coi các trường hợp ngoại lệ như một kiểu con của các ngắt, thay vì một phần của một thể loại riêng biệt.
ruthafjord

1
Tôi nghĩ rằng câu trả lời này mô tả nó tốt nhất. Nó thảo luận về dòng mờ có thể tồn tại giữa hai. Và đề cập rằng lỗi trang dẫn đến CPU đánh lừa một lệnh, một cái bẫy bỏ qua hướng dẫn và tiếp tục.
in70x

9

Nói chung, các thuật ngữ như ngoại lệ, lỗi, hủy bỏ, BẫyNgắt đều có nghĩa tương tự và được gọi là "Ngắt".

Đến với sự khác biệt giữa Bẫy và Ngắt:

Bẫy: Là một lập trình viên khởi xướng và dự kiến ​​chuyển quyền kiểm soát sang một thói quen xử lý đặc biệt. (Ví dụ: hướng dẫn INT 80x86 là một ví dụ tốt)

Trong khi

Ngắt (Phần cứng): Là gián đoạn điều khiển chương trình dựa trên sự kiện phần cứng bên ngoài bên ngoài CPU (Ví dụ: Nhấn phím trên bàn phím hoặc hết thời gian trên chip hẹn giờ)


Định nghĩa tốt. Nguồn?
alexlomba87

6

Một cái bẫy là một loại đặc biệt của ngắt được thường được gọi là một phần mềm gián đoạn . Một ngắt là một thuật ngữ tổng quát hơn trong đó bao gồm cả các ngắt phần cứng (ngắt từ các thiết bị phần cứng) và ngắt phần mềm (ngắt từ phần mềm, chẳng hạn như cái bẫy ).


4
Nó nhầm lẫn vấn đề thậm chí nhiều hơn mà một số tác giả (Tanenbaum) đề cập đến "bẫy phần cứng." Nếu chúng ta có thể có bẫy phần cứng và ngắt phần mềm, rõ ràng các định nghĩa khá lầy lội và có thể đi theo bất kỳ cách nào, luôn yêu cầu phần cứng hoặc phần mềm từ.
The111

3

Một cái bẫy được gọi bằng mã như các chương trình và được sử dụng, ví dụ như để gọi các thói quen của hệ điều hành (tức là thông thường đồng bộ). Một ngắt được gọi bởi các sự kiện (nhiều lần phần cứng, như card mạng đã nhận dữ liệu hoặc bộ định thời CPU) và - như tên cho thấy - làm gián đoạn luồng điều khiển thông thường, vì CPU phải chuyển sang thói quen trình điều khiển để xử lý sự kiện.


2

Ngắt là sự thay đổi dòng chảy do phần cứng tạo ra trong hệ thống. Một trình xử lý ngắt được triệu tập để xử lý nguyên nhân của ngắt; kiểm soát sau đó được đưa trở lại bối cảnh và hướng dẫn bị gián đoạn. Một cái bẫy là một ngắt được tạo ra bằng phần mềm. Một ngắt có thể được sử dụng để báo hiệu việc hoàn thành I / O để làm giảm nhu cầu thăm dò thiết bị. Một cái bẫy có thể được sử dụng để gọi các thói quen của hệ điều hành hoặc để bắt các lỗi số học.


2

Tôi nghĩ rằng bẫy được gây ra bởi việc thực hiện lệnh hiện tại và do đó chúng được gọi là các sự kiện đồng bộ. trong đó các ngắt được gây ra bởi một lệnh độc lập đang chạy trong bộ xử lý có liên quan đến các sự kiện bên ngoài và do đó được gọi là các sự kiện không đồng bộ.


2

Ngắt là các ngắt phần cứng, trong khi các bẫy là các ngắt được gọi bằng phần mềm. Sự xuất hiện của các ngắt phần cứng thường vô hiệu hóa các ngắt phần cứng khác, nhưng điều này không đúng với các bẫy. Nếu bạn cần không cho phép ngắt phần cứng cho đến khi bẫy được phục vụ, bạn cần xóa cờ ngắt một cách rõ ràng. Và thông thường cờ ngắt trên máy tính ảnh hưởng đến ngắt (phần cứng) trái ngược với bẫy. Điều này có nghĩa là việc xóa cờ này sẽ không ngăn được bẫy. Không giống như bẫy, ngắt nên duy trì trạng thái trước đó của CPU.


1

Bẫy là một phần mềm bị gián đoạn. Nếu bạn viết chương trình trong đó bạn khai báo một biến có giá trị bằng 0 thì nó được coi là một cái bẫy. Bất cứ khi nào bạn chạy chương trình này, nó sẽ đưa ra cùng một lỗi. Cuộc gọi hệ thống là một lỗi phiên bản đặc biệt của bẫy trong đó một chương trình yêu cầu os cho dịch vụ cần thiết của nó. Trong trường hợp ngắt (một từ chung cho ngắt phần cứng) như lỗi i / o, cpu bị gián đoạn tại thời điểm ngẫu nhiên và tất nhiên đó không phải là lỗi của các lập trình viên của chúng tôi. Đây là phần cứng đưa chúng lên.


1
Bạn có thể giải thích cách gọi hệ thống là một cái bẫy?
Radha Gogia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.