2012-11-16 18 views
5

Mục đích của bộ vi xử lý gửi một Inter Processor Interrupt cho chính nó trên kiến ​​trúc IA-32 là gì?Mục đích của tự IPI trên IA-32

Theo sách hướng dẫn dành cho nhà phát triển phần mềm kiến ​​trúc Intel IA-32, Vol. 3, Ch. 10.1:

IPI được sử dụng để tự ngắt phần mềm, chuyển tiếp ngắt hoặc lập lịch trước.

Nhưng tại sao bạn sẽ sử dụng IPI tự khi bộ xử lý cũng có thể tự ngắt bằng lệnh INT? Tính năng này có vẻ không cần thiết.

Trả lời

3

Tôi nghĩ lý do chính là nhất quán: Nếu bạn đang viết phần mềm cho bộ xử lý đa lõi, và bạn muốn gửi gián đoạn tới tất cả các lõi trong hệ thống, nó sẽ hút phải thực hiện IPI với nhau lõi, sau đó thực hiện INT để ngắt lõi hiện tại, và tất nhiên bạn cũng sẽ phải thiết lập các trình xử lý cho cả hai nguồn ngắt vv .. Nó chỉ là dễ dàng hơn nhiều để gửi IPI cho tất cả mọi người.

Một trường hợp khác có thể là hệ thống đa lõi nơi bạn đang chuyển công việc hoặc thông điệp xung quanh đến lõi "miễn phí" để xử lý tải. Lõi "miễn phí" có thể là lõi hiện tại, một lần nữa bạn không muốn có một trường hợp đặc biệt trong phần mềm chỉ vì bạn đang gửi một ngắt cho chính mình.

+0

Cả hai lý do đều sai tôi nghĩ. Mỗi bộ xử lý logic (do đó mỗi lõi) có APIC cục bộ riêng của nó. Điều này có nghĩa là chỉ một IPI tự nhận được bởi lõi cụ thể đã gửi nó.Thứ hai, có một viết tắt đích đặc biệt có sẵn để gửi một IPI đến tất cả các APICS địa phương trong một hệ thống bao gồm cả chính nó. – jmiller

+0

Vui lòng đọc lại, vì tôi chỉ đưa ra một lý do để tự IPI (nhất quán) và hai ví dụ minh họa sự nhất quán. –

2

Có một lý do khác để tự IPI.

Nếu bạn khởi tạo trình xử lý SMI, đầu tiên nó nằm ở địa chỉ thấp trong ram. Toàn bộ trạng thái CPU được lưu trong SMI. Tuy nhiên, tất cả các CPU ban đầu sẽ sử dụng cùng một vùng trạng thái và địa chỉ được định vị lại mới được thiết lập bằng thao tác của một biến trạng thái.

Trong trường hợp này, bạn muốn gửi SMI ban đầu cho một CPU tại thời điểm đó. Nếu bạn gửi nó cho tất cả họ sẽ sử dụng cùng một khu vực để lưu trữ nhà nước và đó sẽ là một thảm họa. Nó thuận tiện để sử dụng cùng một thói quen khởi tạo cho việc chuyển đổi trình xử lý SMI cho tất cả các CPU, vì vậy bạn có thể sử dụng IPI tự với kiểu SMI để nhập mã di chuyển SMI.

BSP có thể gửi IPI SMI đến chính nó và sau đó một AP tại thời điểm đó. Sau đó, chúng sẽ được chuyển đến các khu vực không xung đột.

Tôi chắc chắn rằng có nhiều tình huống khác cần có IPI tự. Bất cứ khi nào các CPU chia sẻ một khu vực quan trọng như trong trạng thái SMI ban đầu, IPI tự được thúc đẩy cho tính nhất quán.

2

Tôi đoán bạn đã biết lý do từ 2 năm trôi qua.

Nhưng đây là sự hiểu biết của tôi:

IPI có thể bị chặn khi IRQ bị vô hiệu hóa, nó được lưu giữ bởi IOAPIC, cho đến khi số phận cốt lõi tái phép IRQ với một lệnh sti. Tuy nhiên một lệnh int luôn bẫy CPU ở mức thấp hơn, cho dù IRQ có được bật hay không.

Vì vậy, có thể tự IPI là cần thiết khi hạt nhân muốn làm điều gì đó, nhưng không phải bây giờ khi IRQ bị tắt. Vì vậy, nó tự gửi một IPI, làm cho ngắt như vậy xảy ra ngay sau khi IRQ trên lõi đó được kích hoạt lại.