2012-08-12 24 views
7

Tôi định sử dụng Qemu để tạo ra một dấu vết bộ nhớ để thực thi hệ điều hành khách x86.hoạt động bộ nhớ qemu

Theo trang wiki tcg, Qemu sử dụng một số ít người trợ giúp để tạo tải/lưu trữ cho bộ nhớ đích (khách). Danh sách hướng dẫn này là tcg_gen_qemu_ld8s/u, tcg_gen_qemu_ld16s/u, tcg_gen_qemu_ld32s/u, tcg_gen_qemu_ld64. (Chúng tôi có một bộ tương tự cho hướng dẫn cửa hàng). Tôi bẫy tất cả các cuộc gọi đến các chức năng trên trong mục tiêu-i386/translate.c tập tin

Tuy nhiên, tôi vẫn còn thiếu tải/cửa hàng của hướng dẫn nhất định như

cmp ecx, [r12+0x4] 
mov r10b, [r13+0x0] 
mov byte [rax+0xf0000], 0x0 
mov byte [rax+rdx], 0x0 

Câu hỏi:

  1. Ai đó có thể vui lòng trỏ đến các điểm tải/lưu trữ khác (trực tiếp hoặc gián tiếp) mà tôi bị thiếu?
  2. Qemu có cung cấp một chức năng điểm vào duy nhất để truy cập vào bộ nhớ khách (như guest_read()) có thể được thiết bị để truy tìm tất cả các tải từ bộ nhớ khách ???
  3. Ai đó có thể xin vui lòng trỏ đến một tài liệu tốt, nơi tôi có thể hiểu làm thế nào qemu duy trì trạng thái của bộ nhớ khách ??

Xin lỗi bạn bè vì hướng dẫn gây hiểu lầm trong thư trước đó.

cmp ecx, [r12+0x4] 
mov r10b, [r13+0x0] 
mov byte [rax+0xf0000], 0x0 
mov byte [rax+rdx], 0x0 

Dường như tất cả các hướng dẫn ở trên đều được trang trải với người trợ giúp tcg_gen_ld/st.

Nhưng bây giờ tôi đã tình cờ gặp một vấn đề khác:
Ban đầu tôi nghĩ rằng tất cả các tương tác với bộ nhớ khách xảy ra thông qua các hướng dẫn trợ giúp trong tệp translate.c. Tuy nhiên, tôi thấy rằng các hàm trợ giúp cho một số hướng dẫn như cmpxcgh8bcmpxchg16b thực sự đang truy cập bộ nhớ khách.

Vì vậy, điều đó có nghĩa là có nhiều điểm nhập để đọc bộ nhớ khách. Có thể một số người vui lòng giải thích các lệnh ldq và stq được dịch như thế nào để truy cập bộ nhớ khách ??

Trả lời

1

Các chức năng khác tải dữ liệu được gọi là cpu_ld*_datacpu_st*_data hoặc cpu_ld*_data_racpu_st*_data_ra. Phiên bản _ra có một đối số bổ sung, là địa chỉ của người gọi trong mã được tạo. Nó được sử dụng để tính toán địa chỉ của hướng dẫn lỗi trong trường hợp tải hoặc lưu trữ tạo ra lỗi trang.

Ví dụ, grepping cho cmpxchg8b cho

target/i386/mem_helper.c:void helper_cmpxchg8b(CPUX86State *env, target_ulong a0) 

và bên trong hàm:

uintptr_t ra = GETPC(); 
... 
oldv = cpu_ldq_data_ra(env, a0, ra); 
newv = (cmpv == oldv ? newv : oldv); 
/* always do the store */ 
cpu_stq_data_ra(env, a0, newv, ra); 
Các vấn đề liên quan