Các hướng dẫn x86 có yêu cầu mã hóa riêng cũng như tất cả các đối số của chúng có mặt trong bộ nhớ cùng một lúc không?


64

Tôi đang cố gắng tìm hiểu liệu có thể chạy Linux VM mà RAM chỉ được hỗ trợ bởi một trang vật lý duy nhất hay không.

Để mô phỏng điều này, tôi đã sửa đổi trình xử lý lỗi trang lồng nhau trong KVM để loại bỏ bit hiện tại khỏi tất cả các mục của bảng trang lồng nhau (NPT), ngoại trừ một lỗi tương ứng với lỗi trang hiện đang xử lý.

Trong khi cố gắng bắt đầu một khách Linux, tôi đã quan sát thấy các hướng dẫn lắp ráp sử dụng toán hạng bộ nhớ, như

add [rbp+0x820DDA], ebp

dẫn đến một vòng lặp lỗi trang cho đến khi tôi khôi phục bit hiện tại cho trang chứa hướng dẫn cũng như cho trang được tham chiếu trong toán hạng (trong ví dụ này [rbp+0x820DDA]).

Tôi tự hỏi tại sao đây là trường hợp. 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ớ? Hoặc x86 có yêu cầu rằng trang hướng dẫn cũng như tất cả các trang toán hạng có thể truy cập cùng một lúc không?

Tôi đang thử nghiệm trên AMD Zen 1.


2
Tại sao bạn muốn làm điều này?
SS Anne

11
Chỉ cần quan tâm đến kỹ thuật :)
savvyorms

14
Nâng cao ý tưởng dự án vui nhộn.
ống

10
Điều này thật điên rồ ở mức độ "khởi động Linux trên trình giả lập 486 chạy bằng JavaScript trong trình duyệt". Tôi thích nó.
chrylis -on đình công-

3
Heh, rõ ràng tôi đã đưa câu hỏi này đến cùng một kết luận hợp lý mà bạn đã nghĩ, về bộ công việc tối thiểu để đảm bảo tiến độ. Tôi đã trả lời rằng trước khi bạn thêm đoạn đầu tiên mới vào câu hỏi. : PI đã thêm một số liên kết và nhiều chi tiết hơn ở một vài điểm (ví dụ: trình duyệt trang được phép lưu trữ một số mục trong thư mục trang của khách) vì câu hỏi này đang được chú ý nhiều hơn tôi mong đợi nhờ vào cách nào đó gửi đến HNQ.
Peter Cordes

Câu trả lời:


56

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 iretxử 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], regsẽ đượ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ó locktiề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):

  • movsqhoặc lệnh movsw2 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 movsdcũ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 invlpghoặ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.


15
Trường hợp xấu nhất cho một lệnh đơn lẻ có thể là một cái gì đó như " push dword [foo" (hoặc thậm chí chỉ call [foo]) với mọi thứ được sắp xếp sai theo "ranh giới bảng con trỏ thư mục trang" (thêm tối đa 6 trang, 6 bảng trang, 6 thư mục trang, 6 PDPT và một PML4); với tính năng "lấy mẫu dựa trên sự kiện chính xác với bộ đệm PEBS" của CPU được bật và định cấu hình để pushdữ liệu giám sát hiệu suất được thêm vào bộ đệm PEBS. Đối với một "trang tối thiểu được bảo mật do chủ nhà cung cấp để khách có thể tiến bộ trong các trường hợp bệnh lý" tôi muốn có ít nhất 16 trang.
Brendan

4
Lưu ý rằng loại điều này luôn luôn phổ biến trong các kiến ​​trúc CISC-y. Một số bộ vi xử lý giải mã một phần hướng dẫn và chuyển trạng thái microregister trên lỗi trang, nhưng một số khác không và / hoặc yêu cầu toán hạng địa chỉ đó cho các hướng dẫn "loop-y" (DBRA trên m68k, MOVC3 / MOVC5 trên Vax, v.v.) đến ví dụ REP MOVS của bạn.

1
@Brendan: ai đó đã tính một trường hợp xấu nhất trong hướng dẫn VAX là khoảng 50 trang. Tôi quên các chi tiết, nhưng rõ ràng là bạn sẽ tự đặt hướng dẫn trên một ranh giới trang, sử dụng một cái gì đó như tra cứu bảng dịch với bảng bao trùm một ranh giới trang, sử dụng (rX) [rY] với các chỉ dẫn ở ranh giới trang và Sớm. Các hướng dẫn hairiest mất tới 6 toán hạng (tải chúng vào r0-r5) và tất cả sáu có thể là hai hướng dẫn, tôi nghĩ.

3
HĐH có thể thay đổi hướng dẫn, nhưng nó cũng có thể thay đổi EIP. Vì vậy, có một câu hỏi tiếp theo hợp lý. Số lượng trang tối thiểu cần thiết là bao nhiêu, giả sử sơ đồ vá hướng dẫn thông minh? Ví dụ, sao chép giá trị không được sắp xếp vào bộ đệm đầu được căn chỉnh, mô phỏng hướng dẫn và IRET sang hướng dẫn tiếp theo.
MSalters

1
Trang chứa irethướng dẫn của HĐH cũng cần có trong bộ nhớ. Đây là một lệnh một byte, vì vậy thêm một trang. Địa chỉ ngắt xử lý lỗi trang cũng cần có trong bộ nhớ, nhưng đó có thể là cùng một trang như trên.
Stig Hemmer
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.