Làm thế nào để trình giả lập làm việc và chúng được viết như thế nào? [đóng cửa]


968

Làm thế nào để giả lập làm việc? Khi tôi thấy trình giả lập NES / SNES hoặc C64, nó làm tôi kinh ngạc.

http://www.tommowalker.co.uk/snemzelda.png

Bạn có phải mô phỏng bộ xử lý của các máy đó bằng cách diễn giải các hướng dẫn lắp ráp cụ thể của nó không? Những gì khác đi vào nó? Chúng thường được thiết kế như thế nào?

Bạn có thể đưa ra lời khuyên nào cho ai đó thích viết trình giả lập (đặc biệt là hệ thống trò chơi) không?


15
Điều quan trọng nhất bạn cần tìm là "hướng dẫn lập trình viên" cho hệ thống đó, vì chi tiết đó là "hợp đồng" giữa nhà cung cấp CTNH và các lập trình viên, và ẩn các chi tiết không liên quan và có thể thay đổi. Cơ hội của bạn phụ thuộc vào sự phổ biến của hệ thống.
Uri

155
Lựa chọn trò chơi tốt.
Cristián Romo


16
Đối với bất cứ ai thắc mắc Thi đua vs Mô phỏng
Lazer

8
Kể từ lần đầu tiên tôi chơi trò chơi đó, tôi đã luôn tự hỏi tại sao Hyrule lại bị vùi lấp bởi những tảng đá "8 quả bóng" :-)
Sông Vivian

Câu trả lời:


1124

Thi đua là một lĩnh vực nhiều mặt. Dưới đây là những ý tưởng cơ bản và các thành phần chức năng. Tôi sẽ chia nó thành từng mảnh và sau đó điền chi tiết thông qua các chỉnh sửa. Nhiều điều tôi sẽ mô tả sẽ đòi hỏi kiến ​​thức về hoạt động bên trong của bộ xử lý - kiến ​​thức lắp ráp là cần thiết. Nếu tôi hơi mơ hồ về một số điều nhất định, xin vui lòng đặt câu hỏi để tôi có thể tiếp tục cải thiện câu trả lời này.

Ý kiến ​​cơ bản:

Thi đua hoạt động bằng cách xử lý hành vi của bộ xử lý và các thành phần riêng lẻ. Bạn xây dựng từng phần riêng lẻ của hệ thống và sau đó kết nối các phần giống như dây dẫn trong phần cứng.

Thi đua xử lý:

Có ba cách xử lý mô phỏng bộ xử lý:

  • Diễn dịch
  • Biên dịch động
  • Biên dịch tĩnh

Với tất cả các đường dẫn này, bạn có cùng một mục tiêu chung: thực thi một đoạn mã để sửa đổi trạng thái bộ xử lý và tương tác với 'phần cứng'. Trạng thái bộ xử lý là tập hợp các thanh ghi bộ xử lý, bộ xử lý ngắt, v.v. cho một mục tiêu bộ xử lý đã cho. Đối với 6502, bạn muốn có một số nguyên 8-bit đại diện cho thanh ghi: A, X, Y, P, và S; bạn cũng có một thanh ghi 16 bit PC.

Với giải thích, bạn bắt đầu tại IP(con trỏ lệnh - còn được gọi là bộ PCđếm chương trình) và đọc hướng dẫn từ bộ nhớ. Mã của bạn phân tích cú pháp hướng dẫn này và sử dụng thông tin này để thay đổi trạng thái bộ xử lý như được chỉ định bởi bộ xử lý của bạn. Vấn đề cốt lõi với giải thích là nó rất chậm; mỗi lần bạn xử lý một lệnh đã cho, bạn phải giải mã nó và thực hiện thao tác cần thiết.

Với tính năng biên dịch lại động, bạn lặp lại mã giống như diễn giải, nhưng thay vì chỉ thực thi các mã, bạn xây dựng một danh sách các hoạt động. Khi bạn đạt được một hướng dẫn chi nhánh, bạn biên dịch danh sách các hoạt động này thành mã máy cho nền tảng máy chủ của bạn, sau đó bạn lưu bộ đệm được biên dịch mã này và thực hiện nó. Sau đó, khi bạn nhấn lại một nhóm hướng dẫn cụ thể, bạn chỉ phải thực thi mã từ bộ đệm. .

Với biên dịch lại tĩnh, bạn thực hiện tương tự như trong biên dịch lại động, nhưng bạn theo các nhánh. Cuối cùng, bạn xây dựng một đoạn mã đại diện cho tất cả các mã trong chương trình, sau đó có thể được thực thi mà không bị can thiệp thêm. Đây sẽ là một cơ chế tuyệt vời nếu không có các vấn đề sau:

  • Mã không có trong chương trình để bắt đầu (ví dụ: được nén, mã hóa, tạo / sửa đổi trong thời gian chạy, v.v.) sẽ không được biên dịch lại, vì vậy nó sẽ không chạy
  • Nó đã được chứng minh rằng việc tìm tất cả các mã trong một nhị phân nhất định là tương đương với vấn đề Dừng

Chúng kết hợp để làm cho biên dịch lại hoàn toàn không khả thi trong 99% trường hợp. Để biết thêm thông tin, Michael Steil đã thực hiện một số nghiên cứu tuyệt vời về biên dịch tĩnh - thứ tốt nhất tôi từng thấy.

Mặt khác của mô phỏng bộ xử lý là cách bạn tương tác với phần cứng. Điều này thực sự có hai mặt:

  • Thời gian xử lý
  • Xử lý ngắt

Thời gian xử lý:

Một số nền tảng - đặc biệt là các bảng điều khiển cũ hơn như NES, SNES, v.v. - yêu cầu trình giả lập của bạn phải có thời gian nghiêm ngặt để hoàn toàn tương thích. Với NES, bạn có PPU (đơn vị xử lý pixel) yêu cầu CPU đưa pixel vào bộ nhớ vào những thời điểm chính xác. Nếu bạn sử dụng giải thích, bạn có thể dễ dàng đếm chu kỳ và mô phỏng thời gian thích hợp; với biên dịch lại động / tĩnh, mọi thứ rất / phức tạp / phức tạp hơn.

Xử lý ngắt:

Ngắt là cơ chế chính mà CPU giao tiếp với phần cứng. Nói chung, các thành phần phần cứng của bạn sẽ cho CPU biết những gì làm gián đoạn nó quan tâm. Điều này khá đơn giản - khi mã của bạn ném một ngắt nhất định, bạn nhìn vào bảng xử lý ngắt và gọi hàm gọi lại thích hợp.

Giả lập phần cứng:

Có hai mặt để mô phỏng một thiết bị phần cứng nhất định:

  • Mô phỏng chức năng của thiết bị
  • Mô phỏng các giao diện thiết bị thực tế

Lấy trường hợp của một ổ cứng. Các chức năng được mô phỏng bằng cách tạo lưu trữ sao lưu, thói quen đọc / ghi / định dạng, vv Phần này thường rất đơn giản.

Giao diện thực tế của thiết bị phức tạp hơn một chút. Đây thường là một số kết hợp của các thanh ghi ánh xạ bộ nhớ (ví dụ như các phần của bộ nhớ mà thiết bị theo dõi để thay đổi để thực hiện báo hiệu) và ngắt. Đối với ổ cứng, bạn có thể có một khu vực được ánh xạ bộ nhớ nơi bạn đặt các lệnh đọc, ghi, v.v., sau đó đọc lại dữ liệu này.

Tôi sẽ đi vào chi tiết hơn, nhưng có một triệu cách bạn có thể đi với nó. Nếu bạn có bất kỳ câu hỏi cụ thể nào ở đây, vui lòng hỏi và tôi sẽ thêm thông tin.

Tài nguyên:

Tôi nghĩ rằng tôi đã đưa cho một tốt đẹp giới thiệu ở đây, nhưng có một tấn của khu vực bổ sung. Tôi rất vui được giúp đỡ với bất kỳ câu hỏi nào; Tôi đã rất mơ hồ trong hầu hết điều này chỉ đơn giản là do sự phức tạp to lớn.

Liên kết Wikipedia bắt buộc:

Tài nguyên thi đua chung:

  • Zophar - Đây là nơi tôi bắt đầu với việc mô phỏng, đầu tiên tải xuống trình giả lập và cuối cùng là đánh cắp tài liệu lưu trữ khổng lồ của họ. Đây là tài nguyên tuyệt đối tốt nhất bạn có thể có.
  • NGEmu - Không có nhiều tài nguyên trực tiếp, nhưng diễn đàn của họ là vô địch.
  • RomHacking.net - Phần tài liệu chứa các tài nguyên liên quan đến kiến ​​trúc máy cho các bảng điều khiển phổ biến

Dự án giả lập để tham khảo:

  • IronBabel - Đây là một nền tảng mô phỏng cho .NET, được viết bằng Nemerle và biên dịch lại mã thành C # một cách nhanh chóng. Tuyên bố từ chối trách nhiệm: Đây là dự án của tôi, vì vậy xin lỗi không biết xấu hổ.
  • BSnes - Trình giả lập SNES tuyệt vời với mục tiêu chính xác theo chu kỳ.
  • MAME - Trình giả lập arcade. Tài liệu tham khảo tuyệt vời.
  • 6502asm.com - Đây là trình giả lập JavaScript 6502 với một diễn đàn nhỏ thú vị.
  • dynarec'd 6502asm - Đây là một bản hack nhỏ tôi đã thực hiện trong một hoặc hai ngày. Tôi đã lấy trình giả lập hiện có từ 6502asm.com và thay đổi nó để tự động biên dịch lại mã thành JavaScript để tăng tốc độ lớn.

Tài liệu tham khảo biên dịch lại bộ xử lý:

  • Nghiên cứu về biên dịch lại tĩnh được thực hiện bởi Michael Steil (được tham khảo ở trên) lên đến đỉnh điểm trong bài báo này và bạn có thể tìm thấy nguồn và như vậy ở đây .

Phụ lục:

Đã hơn một năm kể từ khi câu trả lời này được gửi và với tất cả sự chú ý mà nó đang nhận được, tôi cho rằng đã đến lúc cập nhật một số thứ.

Có lẽ điều thú vị nhất trong thi đua ngay bây giờ là libcpu , được bắt đầu bởi Michael Steil đã nói ở trên. Đó là một thư viện nhằm hỗ trợ một số lượng lớn các lõi CPU, sử dụng LLVM để biên dịch lại (tĩnh và động!). Nó có tiềm năng rất lớn và tôi nghĩ nó sẽ làm những điều tuyệt vời cho việc thi đua.

emu-docs cũng đã được tôi chú ý, nơi chứa một kho tài liệu hệ thống tuyệt vời, rất hữu ích cho mục đích mô phỏng. Tôi đã không dành nhiều thời gian ở đó, nhưng có vẻ như họ có rất nhiều tài nguyên tuyệt vời.

Tôi rất vui vì bài đăng này rất hữu ích và tôi hy vọng tôi có thể rời khỏi mông của mình và hoàn thành cuốn sách của mình về chủ đề này vào cuối năm / đầu năm tới.


37
Điều này đã sẵn sàng để trở thành một câu trả lời sử thi. Nếu bạn có thể chỉ cho tôi bất kỳ tài nguyên nào thì cuối cùng nó sẽ được đánh giá cao. Tôi đang xem xét có thể hệ thống SNES hoặc NES để mô phỏng và biến nó thành dự án học kỳ của tôi.
mmcdole

8
Chắc chắn rồi. Tôi sẽ tập hợp một danh sách các tài nguyên tốt đẹp. Nếu các bạn có bất kỳ yêu cầu cụ thể, tôi sẽ làm hết sức mình để đáp ứng chúng.
Cody Brocons

3
@thenonhacker, Dự án IronBabel được tham chiếu trong phần tài nguyên của tôi là của tôi. (Nút không biết xấu hổ được đánh dấu;))
Cody Brocons

1
"Điều đó đã được chứng minh rằng việc tìm tất cả các mã trong một nhị phân nhất định tương đương với vấn đề Dừng" - Xin vui lòng tham khảo? Hay phải là "Điều đó đã được chứng minh rằng việc tìm tất cả mã trong bất kỳ nhị phân đã cho nào tương đương với vấn đề Dừng"? Cũng không thể truy cập vào giấy của Steil :-(
squelart

4
Bạn đề cập đến việc bạn đang viết một cuốn sách; bạn có thể vui lòng cung cấp cho chúng tôi một bản cập nhật về điều đó? Tôi, cho một, sẽ quan tâm đến việc đọc nó.
alex


43

Thi đua có vẻ nản chí nhưng thực sự khá dễ hơn so với mô phỏng.

Bất kỳ bộ xử lý nào thường có một đặc tả được viết tốt mô tả các trạng thái, tương tác, v.v.

Nếu bạn hoàn toàn không quan tâm đến hiệu năng, thì bạn có thể dễ dàng mô phỏng hầu hết các bộ xử lý cũ bằng các chương trình hướng đối tượng rất thanh lịch. Ví dụ, bộ xử lý X86 sẽ cần một cái gì đó để duy trì trạng thái của các thanh ghi (dễ), một cái gì đó để duy trì trạng thái của bộ nhớ (dễ) và một cái gì đó sẽ nhận từng lệnh đến và áp dụng nó vào trạng thái hiện tại của máy. Nếu bạn thực sự muốn độ chính xác, bạn cũng sẽ mô phỏng các bản dịch bộ nhớ, bộ nhớ đệm, v.v., nhưng điều đó là có thể thực hiện được.

Trên thực tế, nhiều nhà sản xuất vi mạch và CPU kiểm tra các chương trình dựa trên trình giả lập chip và sau đó chống lại chính chip, giúp họ tìm ra liệu có vấn đề nào trong thông số kỹ thuật của chip hay trong quá trình thực hiện chip trong phần cứng. Ví dụ, có thể viết một đặc tả chip dẫn đến sự bế tắc và khi thời hạn xảy ra trong phần cứng, điều quan trọng là phải xem liệu nó có thể được sao chép trong thông số kỹ thuật hay không vì điều đó cho thấy vấn đề lớn hơn so với việc triển khai chip.

Tất nhiên, trình giả lập cho các trò chơi video thường quan tâm đến hiệu suất để chúng không sử dụng các triển khai ngây thơ và chúng cũng bao gồm mã có giao diện với HĐH của hệ thống máy chủ, ví dụ như sử dụng bản vẽ và âm thanh.

Xem xét hiệu suất rất chậm của các trò chơi video cũ (NES / SNES, v.v.), việc mô phỏng khá dễ dàng trên các hệ thống hiện đại. Trên thực tế, điều tuyệt vời hơn nữa là bạn có thể tải xuống một bộ mọi trò chơi SNES từ trước đến nay hoặc bất kỳ trò chơi Atari 2600 nào, xem xét rằng khi các hệ thống này phổ biến có quyền truy cập miễn phí vào mọi hộp mực sẽ trở thành sự thật.


1
Sự khác biệt giữa mô phỏng và mô phỏng là gì?
Wei Hu

2
@Wei: Nói chung, một trình giả lập được cho là hoạt động "bên ngoài" giống như hệ thống mà nó mô phỏng nhưng không có gì để nói nó phải được thực hiện theo cách tương tự. Một trình giả lập được thực hiện theo cách bắt chước hệ thống mô phỏng và kết quả là nó hoạt động giống như nó.
Uri

Khi bạn thấy "Trình mô phỏng" nghĩ tương tự trong khi trình giả lập "giả lập"
mP.


29

Tôi biết rằng câu hỏi này hơi cũ, nhưng tôi muốn thêm một cái gì đó vào cuộc thảo luận. Hầu hết các câu trả lời ở đây xoay quanh các trình giả lập diễn giải các hướng dẫn máy của các hệ thống mà chúng mô phỏng.

Tuy nhiên, có một ngoại lệ rất nổi tiếng với cái gọi là "UltraHLE" ( bài báo của WIKIpedia ). UltraHLE, một trong những trình giả lập nổi tiếng nhất từng được tạo ra, mô phỏng các trò chơi Nintendo 64 thương mại (có hiệu năng tốt trên máy tính gia đình) tại thời điểm mà nó được coi là không thể làm như vậy. Thực tế, Nintendo vẫn đang sản xuất các tựa game mới cho Nintendo 64 khi UltraHLE được tạo ra!

Lần đầu tiên, tôi thấy các bài viết về trình giả lập trên các tạp chí in mà trước đó, tôi chỉ thấy chúng được thảo luận trên web.

Khái niệm của UltraHLE là biến điều đó thành không thể bằng cách mô phỏng các cuộc gọi thư viện C thay vì các cuộc gọi ở cấp độ máy.


22

Một cái gì đó đáng xem là nỗ lực của Imran Nazar trong việc viết trình giả lập Gameboy bằng JavaScript.


1
Làm cách nào để có được hướng dẫn opcode thô cho trò chơi Gameboy?
Pacerier

Có một số thiết bị có sẵn để bán trên 'thị trường màu xám'. Bạn sẽ không tìm thấy chúng trong bất kỳ cửa hàng lớn nào trong thế giới phát triển. Các thiết bị này có khả năng sao chép các hướng dẫn từ hộp mực trò chơi sang các tệp thường được gọi là "ROM". Google "Gameboy Roms", nhưng coi chừng các liên kết và trang web tấn công không an toàn!
Sông Vivian

18

Đã tạo ra trình giả lập của riêng tôi về Máy vi tính BBC của thập niên 80 (gõ VBeeb vào Google), có một số điều cần biết.

  • Bạn không mô phỏng thực tế như vậy, đó sẽ là một bản sao. Thay vào đó, bạn đang thi đua Nhà nước . Một ví dụ điển hình là máy tính, thực tế có các nút, màn hình, vỏ, v.v. Nhưng để mô phỏng một máy tính, bạn chỉ cần mô phỏng xem các nút lên hay xuống, các phân đoạn LCD nào được bật, v.v. đại diện cho tất cả các kết hợp có thể có của những thứ có thể thay đổi trong một máy tính.
  • Bạn chỉ cần giao diện của trình giả lập xuất hiện và hoạt động như thật. Càng thuyết phục điều này là sự thi đua càng gần. Những gì diễn ra sau hậu trường có thể là bất cứ điều gì bạn thích. Nhưng, để dễ dàng viết một trình giả lập, có một ánh xạ tinh thần xảy ra giữa hệ thống thực, ví dụ như chip, màn hình, bàn phím, bảng mạch và mã máy tính trừu tượng.
  • Để mô phỏng một hệ thống máy tính, dễ nhất là chia nó thành các phần nhỏ hơn và mô phỏng các phần riêng lẻ đó. Sau đó xâu chuỗi toàn bộ lại với nhau cho thành phẩm. Giống như một tập hợp các hộp đen với đầu vào và đầu ra, vốn rất đẹp cho lập trình hướng đối tượng. Bạn có thể chia nhỏ các khối này để làm cho cuộc sống dễ dàng hơn.

Thực tế mà nói, bạn thường muốn viết cho tốc độ và sự trung thực của thi đua. Điều này là do phần mềm trên hệ thống đích sẽ (có thể) chạy chậm hơn phần cứng gốc trên hệ thống nguồn. Điều đó có thể hạn chế sự lựa chọn của ngôn ngữ lập trình, trình biên dịch, hệ thống mục tiêu, vv
Hơn nữa để mà bạn phải định giới hạn những gì bạn đang chuẩn bị để thi đua, ví dụ nó không cần thiết để cạnh tranh với tình trạng điện áp của bóng bán dẫn trong một bộ vi xử lý, nhưng có lẽ nó cần thiết để mô phỏng trạng thái của tập thanh ghi của bộ vi xử lý.
Nói chung, mức độ chi tiết mô phỏng càng nhỏ, bạn sẽ càng nhận được sự trung thực với hệ thống ban đầu.
Cuối cùng, thông tin cho các hệ thống cũ có thể không đầy đủ hoặc không tồn tại. Vì vậy, việc nắm giữ các thiết bị ban đầu là điều cần thiết, hoặc ít nhất là đánh giá cao một trình giả lập tốt khác mà người khác đã viết!


17

Có, bạn phải giải thích toàn bộ mã máy nhị phân "bằng tay". Không chỉ vậy, hầu hết thời gian bạn cũng phải mô phỏng một số phần cứng kỳ lạ không có tương đương trên máy mục tiêu.

Cách tiếp cận đơn giản là diễn giải từng hướng dẫn một. Điều đó hoạt động tốt, nhưng nó chậm. Một cách tiếp cận nhanh hơn là biên dịch lại - dịch mã máy nguồn sang mã máy đích. Điều này phức tạp hơn, vì hầu hết các hướng dẫn sẽ không ánh xạ một-một. Thay vào đó, bạn sẽ phải thực hiện các công việc phức tạp liên quan đến mã bổ sung. Nhưng cuối cùng thì nó nhanh hơn nhiều. Hầu hết các trình giả lập hiện đại làm điều này.


1
Điều tồi tệ nhất là thiếu tài liệu cho đến nay. Đó là khi bạn phát hiện ra rằng lõi Z80 được sửa đổi trong GameBoy Color có các hoạt động cờ không có giấy tờ mà trò chơi bạn đang thử nghiệm sử dụng khiến bạn thực sự bắt đầu mất niềm tin.
Callum Rogers

1
Pet peeve: Đó là máy (số ít), không phải máy (số nhiều); giống như Morse không phải Morse .
Lawrence Dol

1
@Vilx: Thật ra không - thuật ngữ "mã máy", đề cập đến tập lệnh cho CPU đã được sử dụng kể từ khi bắt đầu phần mềm và không phải là số nhiều. Nó đề cập đến " tập lệnh ", một dạng số ít, không phải dạng "hướng dẫn" số nhiều. Giống như mã chương trình, Mã Morse, v.v ... Việc sử dụng dạng số nhiều đã xuất hiện từ việc sử dụng sai, thường là bởi những người nói tiếng Anh như ngôn ngữ thứ hai.
Lawrence Dol

1
@Software Monkey - Nhưng tôi không thể sử dụng từ "mã" để chỉ một mục duy nhất trong bộ? Ví dụ: " ... --- ...- ba mã Morse này đại diện cho ba chữ S, O, S." Bởi vì ...một mã đại diện cho chữ "S". Không?
Vilx-

1
Không, mã là danh từ không đếm được, nó không có dạng số nhiều như nước hay cát ..
Ivan

15

Khi bạn phát triển trình giả lập, bạn đang diễn giải cụm bộ xử lý mà hệ thống đang làm việc (Z80, 8080, CPU PS, v.v.).

Bạn cũng cần phải mô phỏng tất cả các thiết bị ngoại vi mà hệ thống có (đầu ra video, bộ điều khiển).

Bạn nên bắt đầu viết trình giả lập cho các hệ thống simpe như Game Boy cũ (sử dụng bộ xử lý Z80, tôi không nhầm lẫn) HOẶC cho C64.


9
C64 một hệ thống "đơn giản"? Mặc dù 6510 tương đối đơn giản (một khi bạn đã bao gồm các mã không được liệt kê), các chip âm thanh (SID) và video (VIC) là bất cứ điều gì nhưng đơn giản. Để đạt được bất kỳ mức độ tương thích tốt nào, bạn cần phải mô phỏng chúng - lỗi phần cứng và tất cả.
moobaa

10

Trình giả lập rất khó để tạo vì có nhiều hack (như trong các hiệu ứng bất thường), các vấn đề về thời gian, v.v. mà bạn cần phải mô phỏng.

Để biết ví dụ về điều này, hãy xem http://queue.acm.org/detail.cfm?id=1755886 .

Điều đó cũng sẽ cho bạn thấy lý do tại sao bạn 'cần' CPU nhiều GHz để mô phỏng 1 MHz.


9

Ngoài ra, hãy xem Darek Mihocka's Emulators.com để được tư vấn tuyệt vời về tối ưu hóa mức hướng dẫn cho JIT và nhiều ưu điểm khác trong việc xây dựng các trình giả lập hiệu quả.


7

Tôi chưa bao giờ làm bất cứ điều gì thú vị để mô phỏng bảng điều khiển trò chơi nhưng tôi đã tham gia một khóa học khi bài tập được viết là trình giả lập cho máy được mô tả trong Tổ chức máy tính có cấu trúc Andrew Tanenbaums . Đó là niềm vui và đã cho tôi rất nhiều khoảnh khắc aha. Bạn có thể muốn chọn cuốn sách đó trước khi lao vào để viết một trình giả lập thực sự.


4

Tư vấn về việc mô phỏng một hệ thống thực sự hoặc điều của riêng bạn? Tôi có thể nói rằng các trình giả lập hoạt động bằng cách mô phỏng phần cứng ENTIRE. Có thể không xuống mạch (vì các bit di chuyển xung quanh như CTNH sẽ làm. Di chuyển byte là kết quả cuối cùng nên sao chép byte là tốt). Trình giả lập rất khó để tạo vì có nhiều hack (như trong các hiệu ứng bất thường), các vấn đề về thời gian, v.v. mà bạn cần phải mô phỏng. Nếu một phần (đầu vào) sai, toàn bộ hệ thống có thể làm hỏng hoặc tốt nhất là có lỗi / trục trặc.


4

Các Emulator Device chia sẻ mã nguồn mô phỏng chứa mã nguồn có thể xây dựng thành trình giả lập PocketPC / Smartphone (Yêu cầu Visual Studio, chạy trên Windows). Tôi đã làm việc trên V1 và V2 của bản phát hành nhị phân.

Nó giải quyết nhiều vấn đề mô phỏng: - dịch địa chỉ hiệu quả từ khách ảo sang khách vật lý để lưu trữ ảo - biên dịch mã JIT của khách - mô phỏng các thiết bị ngoại vi như bộ điều hợp mạng, màn hình cảm ứng và tích hợp giao diện người dùng, cho bàn phím và chuột máy chủ - lưu / khôi phục trạng thái, để mô phỏng sơ yếu lý lịch từ chế độ năng lượng thấp


1

Để thêm câu trả lời được cung cấp bởi @Cody Brocons
Trong bối cảnh ảo hóa nơi bạn đang mô phỏng một hệ thống mới (CPU, I / O, v.v.) cho một máy ảo, chúng ta có thể xem các loại trình giả lập sau.

Dịch nghĩa: bochs là một ví dụ về trình thông dịch, nó là trình giả lập PC x86, nó lấy mỗi lệnh từ hệ thống khách dịch nó trong một tập lệnh khác (của máy chủ ISA) để tạo ra hiệu ứng mong muốn. Có rất chậm, nó không chậm Không lưu trữ bất cứ thứ gì để mọi hướng dẫn đều trải qua cùng một chu kỳ.

Trình giả lập động: Qemu là trình giả lập động. Nó thực hiện trên bản dịch hướng dẫn khách cũng lưu trữ kết quả. Phần tốt nhất là thực thi càng nhiều hướng dẫn càng tốt trực tiếp trên hệ thống máy chủ để việc mô phỏng nhanh hơn. Cũng như được đề cập bởi Cody, nó chia mã thành các khối (1 luồng thực thi duy nhất).

Trình giả lập tĩnh: Theo tôi biết không có trình giả lập tĩnh nào có thể hữu ích trong việc ảo hóa.


1

Làm thế nào tôi sẽ bắt đầu thi đua.

1.Nhận sách dựa trên lập trình cấp thấp, bạn sẽ cần nó cho hệ điều hành "giả vờ" của ... cậu bé trò chơi ...

2.Nhận sách về thi đua cụ thể, và có thể phát triển os. (bạn sẽ không làm os, nhưng gần nhất với nó.

3. nhìn vào một số trình giả lập mã nguồn mở, đặc biệt là các trình giả lập của hệ thống mà bạn muốn tạo một trình giả lập.

Đoạn trích 4.copy của mã phức tạp hơn vào IDE / trình biên dịch của bạn. Điều này sẽ giúp bạn tiết kiệm viết mã dài. Đây là những gì tôi làm để phát triển os, sử dụng một quận của linux


1

Tôi đã viết một bài viết về việc mô phỏng hệ thống Chip-8 bằng JavaScript .

Đây là một nơi tuyệt vời để bắt đầu vì hệ thống không quá phức tạp, nhưng bạn vẫn tìm hiểu cách hoạt động của opcodes, ngăn xếp, thanh ghi, v.v.

Tôi sẽ sớm viết một hướng dẫn dài hơn cho NES.

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.