Có, họ yêu cầu mã máy và tất cả các toán hạng bộ nhớ.
CPU không nên truy cập các trang bộ nhớ một cách tuần tự, tức là trước tiên hãy đọc hướng dẫn và sau đó truy cập vào toán hạng bộ nhớ?
Đúng, đó là những gì xảy ra, nhưng một ngoại lệ lỗi trang làm gián đoạn quá trình 2 bước đó và loại bỏ bất kỳ tiến trình nào. CPU không có cách nào để nhớ hướng dẫn của nó ở giữa khi xảy ra lỗi trang.
Khi trình xử lý lỗi trang trở lại sau khi xử lý lỗi trang hợp lệ, RIP = địa chỉ của lệnh bị lỗi, do đó CPU sẽ thực hiện lại từ đầu .
Hệ điều hành sẽ là hợp pháp để sửa đổi mã máy của hướng dẫn lỗi và mong muốn nó thực thi một lệnh khác sau khi iret
xử lý lỗi trang (hoặc bất kỳ trình xử lý ngoại lệ hoặc ngắt nào khác). Vì vậy, AFAIK về mặt kiến trúc yêu cầu CPU phải tìm lại mã từ CS: RIP trong trường hợp bạn đang nói đến. (Giả sử nó thậm chí không quay trở lại với CS: RIP bị lỗi thay vì lên lịch cho một quá trình khác trong khi chờ đĩa bị lỗi trang cứng hoặc gửi SIGSEGV cho trình xử lý tín hiệu trên lỗi trang không hợp lệ.)
Có lẽ nó cũng cần thiết về mặt kiến trúc cho mục nhập / thoát của trình ảo hóa. Và ngay cả khi nó không bị cấm rõ ràng trên giấy, đó không phải là cách CPU hoạt động.
@torek nhận xét rằng một số bộ vi xử lý (CISC) giải mã một phần hướng dẫn và đổ trạng thái microregister trên một lỗi trang , nhưng x86 không như vậy.
Một vài hướng dẫn có thể bị gián đoạn và có thể thực hiện một phần tiến trình, như rep movs
(memcpy trong một lon) và các hướng dẫn chuỗi khác, hoặc thu thập các cửa hàng tải / phân tán. Nhưng cơ chế duy nhất là cập nhật các thanh ghi kiến trúc như RCX / RSI / RDI cho ops chuỗi, hoặc các thanh ghi mặt nạ và đích cho tập hợp (ví dụ: thủ công cho AVX2vpgatherdd
). Không giữ kết quả opcode / giải mã trong một số thanh ghi nội bộ bị ẩn và khởi động lại nó sau khi iret từ trình xử lý lỗi trang. Đây là những hướng dẫn thực hiện nhiều truy cập dữ liệu riêng biệt.
Ngoài ra, hãy nhớ rằng x86 (giống như hầu hết các ISA) đảm bảo rằng các hướng dẫn là wrt nguyên tử. ngắt / ngoại lệ: chúng hoàn toàn xảy ra hoặc hoàn toàn không xảy ra trước khi ngắt. Làm gián đoạn một hướng dẫn lắp ráp trong khi nó đang hoạt động . Vì vậy, ví dụ add [mem], reg
sẽ được yêu cầu loại bỏ tải nếu phần lưu trữ bị lỗi, thậm chí không có lock
tiền tố.
Số trường hợp xấu nhất của các trang không gian người dùng khách có mặt để tiến triển về phía trước có thể là 6 (cộng với các trang phụ của bảng khách-kernel riêng cho mỗi trang):
movsq
hoặc lệnh movsw
2 byte bao trùm một ranh giới trang, vì vậy cả hai trang đều cần thiết để giải mã.
- toán hạng nguồn qword
[rsi]
cũng là một phân chia trang
- toán hạng đích qword
[rdi]
cũng là một phân chia trang
Nếu có bất kỳ lỗi nào trong 6 trang này, chúng tôi sẽ quay lại trang một.
rep movsd
cũng là một lệnh 2 byte và tiến trình trên một bước của nó sẽ có cùng yêu cầu. Các trường hợp tương tự như push [mem]
hoặc pop [mem]
có thể được xây dựng với một ngăn xếp sai.
Một trong những lý do (hoặc lợi ích phụ) để / thực hiện thu thập tải / phân tán lưu trữ "gián đoạn" (cập nhật vectơ mặt nạ với tiến trình của chúng) là để tránh tăng dấu chân tối thiểu này để thực hiện một lệnh đơn. Ngoài ra để cải thiện hiệu quả xử lý nhiều lỗi trong một lần thu thập hoặc phân tán.
@Brandon chỉ ra trong các nhận xét rằng một khách sẽ cần các bảng trang của nó trong bộ nhớ và các phân chia trang không gian người dùng cũng có thể là các phân chia 1GiB để hai bên nằm trong các cây con khác nhau của PML4 cấp cao nhất. Đi bộ trang CTNH sẽ cần phải chạm vào tất cả các trang bảng khách này để đạt được tiến bộ. Một tình huống bệnh lý này không có khả năng xảy ra tình cờ.
TLB (và các bộ phận bên trong trang) được phép lưu trữ một số dữ liệu của bảng trang và không bắt buộc phải khởi động lại trang đi bộ từ đầu trừ khi HĐH đã làm invlpg
hoặc đặt thư mục trang cấp cao nhất CR3 mới. Cả hai điều này đều không cần thiết khi thay đổi một trang từ không có mặt sang hiện tại; x86 trên giấy đảm bảo rằng không cần thiết (vì vậy "bộ nhớ đệm âm" của các PTE không có mặt không được phép, ít nhất là không hiển thị với phần mềm). Vì vậy, CPU có thể không VMexit ngay cả khi một số trang bảng vật lý khách không thực sự có mặt.
Bộ đếm hiệu suất PMU có thể được kích hoạt và cấu hình sao cho lệnh cũng yêu cầu một sự kiện hoàn hảo để ghi vào bộ đệm PEBS cho lệnh đó. Với mặt nạ của bộ đếm được định cấu hình để chỉ đếm các hướng dẫn trong không gian người dùng, không phải kernel, có thể nó sẽ cố gắng tràn bộ đếm và lưu mẫu trong bộ đệm mỗi khi bạn quay lại không gian người dùng, gây ra lỗi trang.