Câu trả lời:
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) .
Bẫy và ngắ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ơ ( ngắt và ngoạ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 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.
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.
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ổ'.
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.
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.
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.
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.
Nói chung, các thuật ngữ như ngoại lệ, lỗi, hủy bỏ, Bẫy và Ngắ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ờ)
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 ).
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.
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.
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ộ.
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.
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.