sách gpt4 ai đã đi

Sử dụng giao diện kvm ioctl để triển khai máy ảo đơn giản nhất trong môi trường ubuntu12.04

In lại Tác giả:qq735679552 Thời gian cập nhật: 2022-09-29 22:32:09 31 4
mua khóa gpt4 Nike

Qemu, Virtual Box, VMware và Xen đều là máy ảo. Hầu hết người dùng đều sử dụng Virtual Box và VMware, được dùng để chạy Windows trong Ubuntu hoặc Ubuntu trong Windows.

Qemu thực sự là trình giả lập mã nguồn mở cơ bản và nổi tiếng nhất. Nó có thể mô phỏng x86, arm và mips bằng phần mềm thuần túy, tốt hơn nhiều so với các trình giả lập khác. Nó cũng có thể sử dụng khả năng tăng tốc phần cứng, chẳng hạn như kvm trên Linux, haxm trên Windows và mac. Các tăng tốc phần cứng này dựa trên initel VT-x, intel VT-d và các công nghệ tương ứng của AMD. Các công nghệ này cung cấp vCPU và bảng trang bóng phần cứng (intel EPT), giúp giảm đáng kể khối lượng công việc của mô phỏng phần mềm qemu.

Cả Virtual Box và Qemu-KVM đều sử dụng Qemu, nhưng chỉ có chức năng mô phỏng thiết bị được sử dụng. Khả năng mô phỏng GPU của Qemu khá kém, do đó trình giả lập Android dựa trên Qemu sẽ triển khai đường ống Qemu của OpenGLES và sử dụng OpenGL trên máy chủ để vẽ.
Xen được sử dụng rộng rãi trong điện toán đám mây và sẽ không được giới thiệu chi tiết ở đây. Các trình mô phỏng khác về cơ bản là một tiến trình chạy trên hệ điều hành thông thường và mỗi lõi là một luồng.

Bài viết này giới thiệu cách sử dụng kvm và triển khai trình mô phỏng đơn giản nhất trong Ubuntu 12.04 trên nền tảng Intel để tính toán kết quả của 2+2 và xuất kết quả qua cổng IO.

Để biết phần giới thiệu về kvm api trong kernel, hãy xem: Documentation/virtual/kvm/api.txt và một số tài liệu khác: Documentation/virtual/kvm/. Mã nguồn đầy đủ: https://lwn.net/Articles/658512/.

Một máy ảo thực sự sử dụng kvm sẽ mô phỏng nhiều thiết bị ảo và chương trình cơ sở, cũng như các trạng thái khởi tạo phức tạp (khởi tạo nhiều thiết bị khác nhau, khởi tạo các thanh ghi CPU, v.v.) và khởi tạo bộ nhớ. Bản demo mô phỏng được mô tả trong bài viết này sẽ sử dụng mã x86 16 bit sau (tại sao lại là 16 bit? Bởi vì x86 ở chế độ thực khi được bật nguồn, hoạt động ở chế độ 16 bit; sau đó chuyển sang chế độ được bảo vệ 32 bit):

Mã RubySao chép nội dung vào clipboard
  1. di chuyển $0x3f8, %dx     
  2. thêm %bl, %al     
  3. thêm $'0', %al     
  4. ra %al, (%dx)     
  5. chuyển động $'\N', %al     
  6. ra %al, (%dx)     
  7. hlt    

Mã này hoạt động như một hệ điều hành khách, về cơ bản là một hệ thống trần. Nó thực hiện 2+2, sau đó thêm '0' để chuyển đổi 4 thành ascii '4' và xuất ra thông qua cổng 0x3f8. Sau đó nó xuất ra '\n' và tắt.

Chúng tôi lưu trữ mã nhị phân tương ứng với mã này vào mảng:

Mã RubySao chép nội dung vào clipboard
  1.   const uint8_t mã[] = {     
  2. 0xba, 0xf8, 0x03, /* di chuyển $0x3f8, %dx */     
  3. 0x00, 0xd8, /* thêm %bl, %al */     
  4. 0x04, '0', /* thêm $'0', %al */     
  5. 0xee, /* ra %al, (%dx) */     
  6. 0xb0, '\N', /* di chuyển $'\N', %al */     
  7. 0xee, /* ra %al, (%dx) */     
  8. 0xf4, /* hlt */     
  9.    };    

Làm sao để có được những mã máy này?

Mã RubySao chép nội dung vào clipboard
  1. shuyin.wsy@10-101-175-19:~$ mèo simple_os.asm     
  2.     di chuyển $0x3f8, %dx     
  3.     thêm %bl, %al     
  4.     thêm $'0', %al     
  5.     ra %al, (%dx)     
  6.     chuyển động $'\N', %al     
  7.     ra %al, (%dx)     
  8.     hlt     
  9. shuyin.wsy@10-101-175-19:~$ như -o simple_os.o simple_os.asm     
  10. shuyin.wsy@10-101-175-19:~$ objdump -d simple_os.o     
  11. simple_os.o: định dạng tệp elf64-x86-64     
  12. Tháo rời phần .text:     
  13. 0000000000000000 <.văn bản>:     
  14.    0: 66 ba f8 03 di chuyển    $0x3f8,%dx     
  15.    4: 00 d8 thêm %bl,%al     
  16.    6:04 30 thêm    $0x30,%     
  17.    8: ee ra %al,(%dx)     
  18.    9: b0 0a di chuyển    $0xa,%     
  19.    b: ee ra %al,(%dx)     
  20.    c: f4 hlt    

Bạn có thể xem hướng dẫn lắp ráp và mã máy tương ứng trên trang web này: http://x86.renejeschke.de/
Lưu ý rằng có thêm 0x66 ở đầu, được giải thích như sau:

Nhóm tiền tố 3 trong http://wiki.osdev.org/X86-64_Instruction_Encoding

Vì vậy, chúng ta cần thêm .code16 vào đầu tệp simple_os.asm, điều này là đúng, nhưng objdump không hiển thị đúng. Chúng ta cần sử dụng nó như thế này:

Mã RubySao chép nội dung vào clipboard
  1. shuyin.wsy@10-101-175-19:~$ objdump -d -Mintel,i8086 simple_os.o     
  2. simple_os.o: định dạng tệp elf64-x86-64     
  3. Tháo rời phần .text:     
  4. 31 4 0
qq735679552
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi