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
-
di chuyển $0x3f8, %dx
-
thêm %bl, %al
-
thêm $'0', %al
-
ra %al, (%dx)
-
chuyển động $'\N', %al
-
ra %al, (%dx)
-
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
-
const uint8_t mã[] = {
-
0xba, 0xf8, 0x03, /* di chuyển $0x3f8, %dx */
-
0x00, 0xd8, /* thêm %bl, %al */
-
0x04, '0', /* thêm $'0', %al */
-
0xee, /* ra %al, (%dx) */
-
0xb0, '\N', /* di chuyển $'\N', %al */
-
0xee, /* ra %al, (%dx) */
-
0xf4, /* hlt */
-
};
Làm sao để có được những mã máy này?
Mã RubySao chép nội dung vào clipboard
-
shuyin.wsy@10-101-175-19:~$ mèo simple_os.asm
-
di chuyển $0x3f8, %dx
-
thêm %bl, %al
-
thêm $'0', %al
-
ra %al, (%dx)
-
chuyển động $'\N', %al
-
ra %al, (%dx)
-
hlt
-
shuyin.wsy@10-101-175-19:~$ như -o simple_os.o simple_os.asm
-
shuyin.wsy@10-101-175-19:~$ objdump -d simple_os.o
-
simple_os.o: định dạng tệp elf64-x86-64
-
Tháo rời phần .text:
-
0000000000000000 <.văn bản>:
-
0: 66 ba f8 03 di chuyển $0x3f8,%dx
-
4: 00 d8 thêm %bl,%al
-
6:04 30 thêm $0x30,%
-
8: ee ra %al,(%dx)
-
9: b0 0a di chuyển $0xa,%
-
b: ee ra %al,(%dx)
-
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ôi trường Grails
Tôi không tìm thấy câu trả lời trong tài liệu nên tôi hỏi ở đây. Trong Grails, khi bạn tạo một ứng dụng, theo mặc định, bạn sẽ nhận được các môi trường sản xuất, phát triển, v.v. Nếu bạn muốn xây dựng WAR để sản xuất, bạn có thể chạy: grails war hoặc gr
-
Môi trường Sitecore
Trang web của tổ chức chúng tôi đang được di chuyển sang Sitecore CMS, nhưng chúng tôi đang gặp khó khăn trong việc thiết lập môi trường cho các nhà phát triển (4), nhà thiết kế (4), nhân viên QA (3), tác giả (10-15) và người phê duyệt (4-10) để họ có thể độc lập
-
Môi trường CVSROOT
Làm thế nào để thiết lập biến môi trường CVSROOT trong WinCVS? Câu trả lời hay nhất Câu trả lời ngắn gọn là: Không cần. Biến môi trường CVSROOT được đánh giá quá cao. CVS(NT) sẽ chỉ sử dụng nó khi tất cả các phương pháp khác để xác định chuỗi kết nối kho lưu trữ đã được sử dụng hết. mọi người
-
Môi trường Haskell
Tôi vừa mới hoàn thành cuốn sách "learnyouahaskell" và bây giờ tôi muốn áp dụng những gì mình học được bằng cách xây dựng một ứng dụng yesod. Nhưng tôi không biết phải bắt đầu thế nào. Có vẻ như có hai lựa chọn về cách thiết lập một dự án yesod. Đầu tiên, Stack
-
Môi trường C#
Trong chương này, chúng ta sẽ thảo luận về các công cụ cần thiết để tạo lập trình C#. Chúng tôi đã đề cập rằng C# là một phần của .Net framework và được sử dụng để viết các ứng dụng .Net. Do đó, trước khi thảo luận về các công cụ có sẵn để chạy chương trình C#, trước tiên chúng ta hãy tìm hiểu những kiến thức cơ bản về C#.
-
03. Môi trường Ruby
Để chạy mã Ruby cần phải cấu hình môi trường ngôn ngữ lập trình Ruby. Trong chương này, chúng ta sẽ tìm hiểu cách cấu hình và cài đặt môi trường Ruby trên nhiều nền tảng khác nhau. Cài đặt Ruby trên nhiều nền tảng khác nhauCài đặt Ruby trên Linux/Unix
-
Công cụ/môi trường phát triển ứng dụng di động tốt nhất?
Hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời được hỗ trợ bằng sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi này có thể gây ra tranh luận, tranh cãi, thăm dò ý kiến hoặc thảo luận mở rộng. Nếu bạn cảm thấy câu hỏi này có thể được cải thiện và có thể mở lại, hãy truy cập
-
Làm thế nào để dọn dẹp hàm đóng (môi trường) khi trả về và lưu?
Tôi có một phép tính như thế này (lưu ý rằng đây chỉ là một ví dụ rất đơn giản, gọn nhẹ, có thể tái tạo tối thiểu!): compute <- function() # phiên bản đơn giản! { # danh sách tất cả các số trong danh sách!
-
Môi trường R / bảng băm chậm lại khi nó phát triển lên đến hàng triệu
Tôi sử dụng môi trường như một bảng băm. Các khóa là các từ trong tài liệu văn bản thông thường và các giá trị là các số nguyên đơn (chỉ mục vào một cấu trúc khác). Khi tôi tải hàng triệu phần tử, cả quá trình cập nhật và tra cứu đều trở nên chậm. Sau đây là một số mã để hiển thị hành vi. Có vẻ như hành vi từ đầu là tốt hơn trong O(n) so với
-
Môi trường saveRDS có thể tái tạo
Tôi đang xây dựng một gói R và sử dụng thư viện RxODE để lưu trữ dữ liệu thô và mô hình dữ liệu được xác định trước. Cách này rất hiệu quả. Tuy nhiên, các tệp .rda kết quả sẽ thay đổi theo từng thế hệ. Một số mô hình chứa môi trường R và quá trình tuần tự hóa dường như bao gồm "thời gian tạo"
-
Xcode Environment - Phím tắt và Tiện ích thụt lề
(Không chắc câu hỏi này có thuộc mục này không, nên xin lỗi nhé) Tôi rất thích Sublime Text và tôi thường thấy Xcode thiếu một số chức năng xử lý văn bản/dữ liệu. Tôi có thể gặp nhiều hơn một vấn đề - 'Command + /' bình luận mã nhưng không
-
Symfony - Chỉ định nghĩa các tuyến đường trong quá trình phát triển. môi trường
Tôi đang sử dụng SF2 và tôi đã tạo một số tuyến đường giúp gỡ lỗi dự án của tôi: widget_debug_page: path: /debug/widget/{widgetName} default
-
Django - môi trường conda
Tôi đã tạo một môi trường conda có tên là MyDjangoEnv. Khi tôi thử kích hoạt nó bằng cách sử dụng source activate MyDjangoEnv, tôi nhận được lỗi: Không có tệp nào như vậy hoặc trực tiếp
-
Môi trường Cordova
Có cách nào để phân biệt giữa các gói chạy từ máy cục bộ và các gói được cài đặt từ Cordova App Store không? Ví dụ, tôi muốn đặt một biến JavaScript có tên là "evn" như thế này: if (cordovaLocal) { env = 'de
-
Một môi trường C đủ khó để học
Thật khó để biết nên hỏi gì ở đây. Câu hỏi này mơ hồ, không đầy đủ, quá rộng hoặc mang tính tu từ và không thể trả lời hợp lý theo hình thức hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp. Đóng 1
-
Bộ công cụ/Môi trường phát triển web Java cho người mới bắt đầu
Nhiệm vụ của tôi là phát triển một trang web tương tác bằng java và mysql: sử dụng servlet để truy xuất và xử lý dữ liệu, và applet để thực hiện xử lý đặc biệt trên dữ liệu máy khách và xử lý các yêu cầu của máy khách đối với các chế độ xem dữ liệu khác nhau. Để sử dụng jav
-
Môi trường Linux - i Strange
Điều này hoạt động như mong đợi: [dgorur@ted ~]$ env -i env [dgorur@ted ~]$ Thực hiện như sau: [dgorur@ted ~]$ env -i which date which: no
-
R: Tìm kiếm băm nhanh trong danh sách (môi trường)
Tôi muốn thực hiện tìm kiếm rất nhanh và có vẻ như sử dụng hàm băm (thông qua môi trường) là cách tốt nhất để thực hiện. Hiện tại, tôi đã chạy một mẫu trong môi trường, nhưng nó không trả về kết quả tôi cần. Đây là một ví dụ: system.time(benchEnv(), g
-
OpenACC trên Windows
Tôi muốn bắt đầu phát triển các chương trình OpenACC và có một số câu hỏi: Có thể thực thi mã OpenACC trên GPU AMD không? Nếu vậy, tôi đang tìm một trình biên dịch có thể hoạt động trên môi trường Windows. Tôi đã mất gần một giờ đồng hồ mà chẳng có gì cả.
-
Môi trường Linux. Làm chậm máy lại
Điều này có vẻ lạ, nhưng liệu có cách nào để tạo ra một cỗ máy (hệ điều hành Linux/Unix - tốt nhất là RHEL) không? Tôi cần kiểm soát tốc độ của máy để đảm bảo mã hoạt động trên các hệ thống rất chậm và xác định điểm dừng chính xác (về mặt thời gian). Một cách tôi có thể làm là
Tôi là một lập trình viên xuất sắc, rất giỏi!