2013-02-26 33 views
5

An nguyên tắc giáo dục là: Không có một điều như một câu hỏi ngu ngốc. Ý tưởng cơ bản đằng sau điều này là mọi người học bằng cách hỏi. Tôi được yêu cầu: "Bạn có thể trình bày và giải thích ở cấp độ lập trình những gì sẽ xảy ra nếu mọi công việc có thể thực hiện tất cả các hướng dẫn."Cách xử lý ngắt Inter Interor

tôi đã làm cho đoạn code

main(){ 
     _asm_("cli;"); 
     while(1); 
    } 

và giải thích nó (hệ thống đông lạnh cho tốt- UP)

Sau đó, tôi được hỏi: "Có thể đưa ra một ví dụ để hệ thống mà không đóng băng ngay cả việc ngắt thanh toán bù trừ này cũng được thực hiện? "

tôi đã sửa đổi các ví dụ trước:

tôi đã làm cho đoạn code

main(){ 
     _asm_("cli;"); 
     i=i/0; 
     while(1); 
    } 

và giải thích nó.

trivially: Nếu chúng ta có nhu cầu phân trang i = i/0 nguyên nhân đầu tiên một lỗi trang (trang dữ liệu không có mặt) và một nhiệm vụ khác có thể được dự kiến ​​sẽ chạy ngắt được kích hoạt trong đĩa đọc và sau trên chia cho số không sẽ ném nhiệm vụ này đi cho tốt.

Nhưng câu trả lời dựa trên UP. Còn SMP thì sao? Tôi phải nói rằng câu trả lời là không đầy đủ. Nó vẫn đủ dễ dàng để xây dựng:

int i; 
    main(){ 
    for(i=0;i<100;i++)// Suppose we have less than 100 CPUs 
     if(fork()) 
     { sleep(5);//The generating task has (most probable) time to do all forks 
     _asm_("cli;"); 
     while(1); 
     } 
    } 

đó sẽ vô hiệu hóa ngắt cho tất cả CPU, bởi vì tất cả các CPU được một nhiệm vụ độc để chạy.

Thậm chí cho đến nay một câu hỏi ngu ngốc đã tiết lộ nhiều điều tốt để học cho người mới bắt đầu: hướng dẫn đặc quyền, phân trang, xử lý lỗi, lên lịch trong DMA, nĩa ..... Nhưng vẫn còn một chút nghi ngờ (xấu hổ với tôi) về chương trình đầu tiên chạy trên SMP.

Một CPU có bị xóa vĩnh viễn hay không? Các CPU khác tiếp tục và có thể gửi re_schedule() thông báo IPI. Điều gì xảy ra sau đó? Nó có thể dễ dàng để suy đoán rằng CPU đông lạnh không thức dậy, bởi vì ngắt bị vô hiệu hóa. Nhưng chắc chắn phải biết nhiều hơn.

Câu hỏi của tôi là: Interruptor Interrupt (IPI) có thể che giấu hoặc không che giấu được không? Ý tôi là trong các triển khai "phổ biến" phổ biến nhất?

Xin lỗi câu hỏi ngu ngốc của tôi. Không khó để tìm ra câu trả lời. Tôi sẽ tìm nó. Tôi có nghĩa là số pin bị gián đoạn (nói với mặt nạ, tôi đoán).


Câu trả lời của riêng tôi - đúng không? Tôi đã nghiên cứu vấn đề này, bởi vì không ai khác thích nó, đến với những suy nghĩ sau:

Với các ứng dụng thời gian thực quan trọng mà chúng tôi đã có trong một thời gian dài một bộ đếm thời gian giám sát (HW làm gián đoạn cpu để trả lời bằng cách nào đó "Tôi đang sống"). Ví dụ: chúng tôi có máy tính điều khiển chính và máy tính dự phòng xử lý hệ thống nếu máy tính chính bị hỏng.

Còn Linux thì sao? Loại cơ quan giám sát nào có chúng tôi? Chúng tôi có thể biên dịch hạt nhân Linux có hoặc không có cơ quan giám sát.

Trình giám sát Linux làm gì? Trên nhiều (!) x86/x86-64 loại phần cứng có một tính năng cho phép chúng tôi tạo ra 'cơ chế giám sát NMI ngắt'. Thậm chí có thể vô hiệu hóa cơ quan giám sát NMI trong thời gian chạy bằng cách viết "0" tới/proc/sys/kernel/nmi_watchdog. Nếu bất kỳ CPU nào trong hệ thống không thực hiện ngắt quãng thời gian cục bộ trong hơn 5 giây, APIC sẽ cố gắng khắc phục tình huống bằng cách ngắt không che giấu được (cpu thực thi trình xử lý và giết chết quy trình)! (SCC Linux là một trường hợp khác với NMI.)

Câu trả lời của tôi (trong câu hỏi ban đầu) được dựa trên hệ thống không có cơ quan giám sát! Có vấn đề để trả lời ở cấp độ chung và đưa ra các ví dụ dựa trên một số hệ thống cố định. Các câu trả lời có thể đúng hoặc không phụ thuộc vào cpu và cấu hình và cài đặt.

Dù sao, nói về NMI có ý nghĩa gì không? Đã làm nó?

+3

Sau nhiều nghiên cứu, tôi trả lời câu hỏi của riêng mình (không ai thích nó). – SikaS

Trả lời

0

Nếu CPU không hạn chế quyền truy cập vào một số hướng dẫn, việc vô tình hoặc cố tình gây ra thảm họa là quá dễ dàng.

push $0 
push $0 
lidt (%esp) 
int $42 

Chuỗi mã này sẽ đặt lại bộ xử lý x86. Đây là lý do:

  • Mã tải đăng ký IDTR với bảng mô tả ngắt (IDT) tại địa chỉ tuyến tính 0, với kích thước một byte.
  • Tăng gián đoạn 42, không thể hoạt động vì vượt quá giới hạn 1 byte của IDT.
  • CPU cố gắng tăng lỗi bảo vệ chung, ngắt 13. Điều này cũng không thành công, vì ngắt 13 vượt quá giới hạn một byte.
  • CPU cố gắng tăng ngoại lệ lỗi kép, ngắt 8. Điều này không thành công, ngắt 8 vượt quá giới hạn của IDT.

Điều này được gọi là lỗi ba. CPU thực hiện một chu kỳ bus tắt để báo cho bo mạch chủ biết rằng nó bây giờ đang bỏ qua mọi thứ và ngừng thực hiện. Bo mạch chủ khẳng định reset, khởi động lại máy.

Điều này thực sự không đáng kể so với mã có thể làm. Một chuỗi mã có thể dễ dàng cướp toàn bộ máy và bắt đầu phá hủy tất cả dữ liệu trên ổ cứng, nó có thể gửi tất cả các tệp của bạn đến máy chủ độc hại trên internet, nó có thể thay đổi mật khẩu của bạn, cho phép truy cập từ xa, kết nối với máy chủ độc hại và cấp cho kẻ tấn công quyền truy cập shell không giới hạn. Không có giới hạn về những gì một chương trình có thể làm.

Bộ vi xử lý có hướng dẫn đặc quyền vì hai lý do, mục đích chính là bảo vệ hệ điều hành khỏi các chương trình lỗi có thể vô tình làm điều gì đó làm giảm hoặc chiếm đoạt toàn bộ máy. Mục đích thứ hai là hạn chế các chương trình độc hại cố ý làm như vậy.

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