Tìm hiểu về giả lập
Trình giả lập là phần cứng hoặc phần mềm cho phép một hệ thống máy tính (được gọi là máy chủ) hoạt động giống như một hệ thống máy tính khác (được gọi là máy khách). Trình giả lập thường cho phép hệ thống máy chủ chạy phần mềm hoặc sử dụng các thiết bị ngoại vi được thiết kế dành riêng cho hệ thống máy khách. Khái niệm giả lập đề cập đến khả năng một chương trình máy tính trong một thiết bị điện tử mô phỏng (hoặc bắt chước) một chương trình hoặc thiết bị khác.
Bạn biết gì về giả lập?
1. Giả lập là gì?
Khái niệm giả lập
Trình giả lập là một phần mềm mô phỏng hành vi của thiết bị hoặc hệ điều hành mà không yêu cầu phần cứng thực tế.
Ví dụ, trình giả lập điện thoại Android sẽ là một ứng dụng chạy trên PC nhưng có diện mạo giống và hoạt động như một điện thoại Android. Trình giả lập sau đó có thể tải xuống và cài đặt các ứng dụng Android, cung cấp cho người dùng PC quyền truy cập vào phần mềm mà cần có điện thoại thực để thực hiện.
Trình giả lập thường được sử dụng với 2 mục đích. Đầu tiên, chúng được các nhà phát triển sử dụng để kiểm tra hệ thống mà không cần một đống thiết bị vật lý. Thứ hai, trình giả lập thường được sử dụng để chạy phần mềm trên máy tính mà bình thường không thể thực hiện được.
Ví dụ, phần mềm Bluestacks cho phép giả lập một máy tính bảng Android trên PC Windows. Sau đó, bạn có thể tải xuống và chơi game Plants vs. Zombie 2 trên PC đó. Nếu không có quá trình giả lập này, bạn chỉ có thể chơi Plants vs Zombies 2 nếu thực sự có máy tính bảng Android.
Trình giả lập hoạt động như thế nào?
Trình giả lập có nhiệm vụ chính là chạy một chương trình lạ. Tóm lại, trình giả lập là phần mềm hoạt động giống như một phần cứng. Trong hầu hết các trường hợp, điều này có nghĩa là mô phỏng tất cả các khả năng của một thành phần phần cứng, dưới dạng một thành phần phần mềm. Không chỉ vậy, các thành phần phần cứng được mô phỏng như phần mềm phải hoạt động mà không có lỗi, nếu không trình giả lập sẽ không hoạt động bình thường.
Khó khăn trong việc biến các phần cứng tiên tiến và đặc biệt thành phần mềm hoạt động được là nguyên nhân tại sao các trình giả lập cho máy chơi game hiện đại phải mất nhiều thời gian để phát triển. Cần rất nhiều công sức và nỗ lực để quá trình giả lập hoạt động, bởi vì phần cứng hiện đại, như PlayStation 4 hoặc Xbox One, cực kỳ phức tạp.
Quay trở lại ví dụ PlayStation, một trình giả lập phải bắt chước một chip âm thanh đặc biệt, card đồ họa, bộ xử lý trung tâm, v.v..., mà không cần xem xét đến việc mô phỏng các thành phần ngoại vi như driver CD.
Vậy thành phần khó nhất để giả lập là gì?
Bộ xử lý trung tâm
Phần cứng khó giả lập nhất thường là đơn vị xử lý trung tâm (CPU). CPU là thành phần cốt lõi của mọi máy tính, từ điện thoại thông minh đến máy chơi game console. Theo nhiều cách, CPU là thành phần máy tính quan trọng nhất liên quan đến giả lập, vì mọi thành phần khác đều liên kết trực tiếp với nó.
Không phải tất cả các CPU đều giống nhau. Điểm khác biệt chính giữa các CPU nằm trong bộ lệnh điều khiển (instruction set) của chúng. Bộ lệnh điều khiển CPU xác định cách máy tính thực hiện các lệnh mà chương trình đưa ra. Trình giả lập sẽ nhắm mục tiêu vào một hệ thống có bộ lệnh điều khiển khác với máy chủ. Ví dụ, CPU của PlayStation sử dụng bộ lệnh điều khiển được gọi là MIPS, khác với máy tính để bàn hoặc laptop sử dụng x86.
Tại sao trình giả lập lại quá chậm?
Sự khác biệt giữa các bộ lệnh điều khiển là một trong những lý do tại sao các trình giả lập đôi khi hoạt động kém hiệu quả. Mọi lệnh CPU mà trình giả lập nhận được phải dịch từ một bộ lệnh điều khiển này sang bộ lệnh khác. Hơn nữa, quá trình dịch bộ lệnh điều khiển này phải diễn ra rất nhanh chóng.
Trong ví dụ trên, CPU giả lập PlayStation nhận lệnh MIPS, dịch nó thành x86, sau đó chạy trên máy tính của bạn.
Việc dịch các bộ lệnh điều khiển tạo cơ sở cho cách trình giả lập mô phỏng toàn bộ thiết bị bên trong máy tính. Hãy xem nó như một phiên dịch viên trong thế giới thực, chuyển tiếp nhanh chóng cuộc trò chuyện giữa hai người nói 2 ngôn ngữ khác nhau. Ngay cả khi việc dịch diễn ra rất nhanh, tốc độ cũng không thể đạt được như khi giao tiếp trực tiếp. Các ngôn ngữ càng phức tạp, việc dịch sẽ càng chậm.
Lợi ích của giả lập
Basilisk II mô phỏng Macintosh 68k bằng cách sử dụng 2 tính năng interpretation code (code thông dịch - code viết bằng ngôn ngữ máy tính có thể hiểu và thực thi được) và dynamic recompilation (hệ thống có thể biên dịch lại một phần của chương trình trong khi thực thi).
- Chất lượng đồ họa có khả năng tốt hơn so với phần cứng gốc.
- Có thể thêm những tính năng bổ sung mà phần cứng ban đầu không có.
- Trình giả lập duy trì giao diện ban đầu, cảm quan và hành vi của đối tượng kỹ thuật số. Điều này cũng quan trọng như chính dữ liệu số vậy.
- Mặc dù số tiền ban đầu bỏ ra để phát triển một trình giả lập hơi cao, nhưng xét về lâu dài, đây vẫn là một giải pháp hiệu quả về chi phí.
- Giảm bớt thời gian lao động. Thay vì phải thực hiện nhiệm vụ di chuyển dữ liệu liên tục cho mọi đối tượng kỹ thuật số, khi thư viện của các hệ điều hành và phần mềm ứng dụng trong quá khứ cũng như hiện tại được thiết lập trong trình giả lập, những công nghệ tương tự này sẽ được dùng cho mọi tài liệu sử dụng các nền tảng đó.
- Nhiều trình giả lập đã được phát triển và phát hành theo giấy phép GNU General Public License thông qua môi trường mã nguồn mở, cho phép tất cả người dùng cộng tác trên quy mô lớn.
- Trình giả lập cho phép phần mềm dành riêng cho một hệ thống có thể sử dụng trên hệ thống khác. Ví dụ, game video độc quyền PlayStation 2 có thể được chơi trên PC bằng trình giả lập. Việc giả lập đặc biệt hữu ích khi hệ thống ban đầu khó hoặc không tương thích với thiết bị hiện đại (ví dụ, các game console cũ kết nối qua đầu ra analog không thể kết nối với TV hiện đại chỉ có đầu vào kỹ thuật số).
2. Các cấp độ giả lập
Giả lập có 2 cấp độ khác nhau: Cấp độ thấp và cấp độ cao. Sự khác biệt chủ yếu của 2 cấp độ này là cách quá trình giả lập được thực hiện.
Giả lập cấp độ thấp
Giả lập cấp độ thấp (Low-level emulation - LLE) bắt chước hành vi của phần cứng được mô phỏng. Máy chủ sẽ tạo một môi trường để ứng dụng chạy ở nơi được xử lý, càng gần càng tốt, vì phần cứng được giả lập sẽ thực hiện nhiệm vụ đó. Để giả lập chính xác nhất, không chỉ tất cả các thành phần, mà cả tín hiệu của chúng cũng phải được mô phỏng. Hệ thống càng phức tạp (có nhiều chip hoặc sử dụng những chip phức tạp), việc thực hiện giả lập cấp độ thấp sẽ càng trở nên khó khăn hơn.
Giả lập cấp độ thấp có thể đạt được thông qua phần cứng hoặc phần mềm. Phần cứng thực tế hoặc thứ gì đó thay thế cho nó, nằm trong chính hệ thống. PlayStation 3 trong hai model đầu tiên đã giả lập phần cứng bằng cách bao gồm phần cứng thực tế được sử dụng trong PlayStation 2. Các máy tính Mac cũ hơn có card add-on, được gọi là card tương thích MS-DOS, có hệ thống dựa trên bộ vi xử lý 486 để chạy ứng dụng x86.
Giả lập cấp độ thấp phần mềm đúng như tên gọi của nó, mô phỏng phần cứng bằng cách sử dụng phần mềm. Nhiều video game console retro và máy tính gia đình 8-bit được giả lập theo cách này bằng cách sử dụng những thành phần đã biết rõ (rất dễ dàng để tìm thấy một hệ thống sử dụng MOS 6502 hoặc Zilog Z80). Một yếu tố có thể thực hiện hoặc phá vỡ việc giả lập là tần suất đồng bộ hóa từng thành phần được mô phỏng. Ví dụ, trình giả lập SNES Higan hoạt động rất chính xác bằng cách tăng số lần các thành phần đồng bộ hóa với nhau. Tuy nhiên, Higan yêu cầu bộ xử lý nhanh hơn rất nhiều so với những gì mà nó đang cố gắng mô phỏng.
Giả lập cấp độ cao
Giả lập cấp độ cao (High-level emulation - HLE) có cách tiếp cận khác để mô phỏng một hệ thống. Thay vì cố gắng giả lập phần cứng, nó mô phỏng chức năng của phần cứng đó. Vào giữa những năm 90, khái niệm trừu tượng hóa phần cứng đã mở rộng ra nhiều hệ thống máy tính hơn, bao gồm cả các video game console. Việc này cho phép việc lập trình trở nên dễ dàng hơn vì bây giờ các nhà phát triển không phải mất công tạo lại những thứ đã có sẵn.
Trừu tượng hóa phần cứng là một cách để che giấu những chi tiết phức tạp của việc kiểm soát phần cứng. Thay vào đó, việc cung cấp một tập hợp các hành động mà nhà phát triển thường sử dụng và tự động thực hiện tất cả các chi tiết nhỏ có liên quan. Ví dụ điển hình là cách interface ổ lưu trữ xuất hiện. Ban đầu, nếu nhà phát triển muốn đọc dữ liệu từ ổ đĩa, họ phải ra lệnh cho ổ đĩa quay, đặt đầu đọc/ghi, chọn vị trí đọc dữ liệu, sau đó lấy và chuyển dữ liệu đến vị trí mong muốn. Với việc trừu tượng hóa phần cứng, nhà phát triển ra lệnh “Tôi muốn đọc tại vị trí này” và firmware trên ổ cứng sẽ đảm nhiệm phần việc còn lại. Giả lập cấp độ cao tận dụng lợi ích từ quá trình trừu tượng hóa phần cứng bằng cách tìm ra (các) lệnh được dự định thực hiện trong môi trường giả lập và để phần cứng máy chủ làm phần còn lại.
Giả lập cấp độ cao có 3 phương pháp chính, mô phỏng chức năng của phần cứng.
- Thông dịch: Trình giả lập thực thi từng dòng code của ứng dụng, bằng cách bắt chước những gì mỗi lệnh phải làm.
- Dynamic Recompiling: Trình giả lập xem xét các đoạn trong hướng dẫn từ bộ vi xử lý của ứng dụng và xem liệu có thể tối ưu hóa những hướng dẫn đó để chạy tốt hơn trên bộ xử lý của máy chủ lưu trữ không. Trái ngược hoàn toàn với việc chạy từng hướng dẫn một.
- Liệt kê danh sách chặn: Các bộ xử lý đồng thời, như GPU và chip âm thanh, có đủ khả năng trừu tượng hóa phần cứng, yêu cầu bộ xử lý chính gửi danh sách lệnh. Đây là một loạt các hướng dẫn cho bộ đồng xử lý biết phải làm gì. Trình giả lập có thể chặn danh sách lệnh và biến chúng thành thứ mà máy chủ có thể xử lý trên bộ đồng xử lý tương tự. Ví dụ, danh sách lệnh đi tới GPU của hệ thống giả lập có thể bị chặn và biến thành các lệnh DirectX hoặc OpenGL để xử lý card video của máy chủ lưu trữ.
Một ví dụ khác về giả lập cấp độ cao là máy ảo Java (Java Virtual Machine - JVM). Code Java không thực sự được biên dịch và chạy tự nhiên trên máy chủ, mà thay vào đó, máy chủ chạy một trình giả lập của máy Java trên lý thuyết. Các ứng dụng được tạo cho .NET framework của Microsoft cũng chạy theo kiểu này.
Hiệu suất mà giả lập cấp độ cao có thể cung cấp là mô phỏng Nintendo 64 trên bộ xử lý Pentium II vào năm 1999, ba năm sau khi phát hành console. Trên thực tế, đây là cách khả thi nhất mà để giả lập Xbox One thành Xbox 360, mặc dù đang chạy phần cứng không thực sự vượt trội.
Nên dùng giả lập cấp độ cao hay cấp độ thấp?
Giả lập cấp độ thấp là một trong những cách chính xác nhất để mô phỏng hệ thống đang được đề cập đến, vì nó sao chép hành vi của phần cứng. Tuy nhiên, giả lập dựa trên phần cứng không phải lúc nào cũng khả thi vì nó làm tăng thêm chi phí cho hệ thống. Bên cạnh đó, việc giả lập dựa trên phần mềm đòi hỏi kiến thức sâu về hệ thống hoặc các bộ phận trong đó. Điều này có thể không thực hiện được nếu tài liệu tham khảo quá “khan hiếm”. Việc giả lập dựa trên phần mềm cũng đòi hỏi một hệ thống mạnh hơn nhiều so với bản gốc để chạy các ứng dụng ở cùng tốc độ. Giả lập cấp độ thấp thường bị giới hạn ở những hệ thống cũ, các trình giả lập nguyên mẫu đang xử lý mọi thứ hoặc thành phần nhỏ hơn của hệ thống như trình điều khiển I/O.
Mặt khác, giả lập cấp độ cao cho phép một hệ thống có phần cứng phức tạp được mô phỏng trên một thứ gì đó chỉ mạnh hơn một chút là được. Giả lập cấp độ cao cũng có thể cho phép một người không có kiến thức sâu về phần cứng có thể mô phỏng nó. Tuy nhiên, vì giả lập cấp độ cao chỉ có thể cung cấp những chức năng của phần cứng, nên nó không thể mô phỏng các tính năng đặc biệt dành riêng cho phần cứng hoặc bất kỳ thủ thuật nào mà các nhà phát triển đã sử dụng để làm điều gì đó vượt quá tiêu chuẩn. Tuy nhiên, gần đây, các nhà phát triển phụ thuộc rất ít vào các thủ thuật. Hầu hết họ sử dụng API tiêu chuẩn công nghiệp, giúp việc giả lập hệ thống không chỉ dễ dàng hơn mà còn có khả năng chạy ứng dụng với hiệu suất tốt hơn. Đây là cách tiếp cận hầu hết các trình giả lập mà những hệ thống hiện đại đang thực hiện.
3. Một số cách để sử dụng giả lập
Có một số cách bạn có thể tận dụng tính năng giả lập. Bạn thậm chí có thể đang sử dụng nó ngay bây giờ mà không hề hay biết! Dưới đây là một vài ví dụ đáng chú ý.
Chạy chương trình 32-bit trên Windows 64-bit
Windows 64-bit khác với Windows 32-bit. Phiên bản Windows 64-bit có thể sử dụng lớp tương thích đặc biệt để chạy các chương trình 32-bit. Không cần phải giả lập toàn bộ hệ thống để mọi thứ hoạt động, vì các chương trình 32-bit đã có thiết kế tương tự. Bởi vì thế, quá trình này là cực kỳ nhanh chóng.
Giả lập mọi console
Các console mới nhất rất khó để giả lập. Mặc dù PlayStation 3 được tung ra thị trường vào năm 2006, nhưng vẫn rất khó để cạnh tranh với một tỷ lệ lớn các game dành cho console.
Tuy nhiên, trình giả lập vẫn tồn tại cho hàng đống video game console, bao gồm nhiều console tốt nhất của những năm 90. Có một phần thưởng khi chạy trình giả lập video game trên phần cứng hiện đại. Các game cũ sẽ được tăng hiệu suất trên phần cứng hiện đại. Tùy thuộc vào trình giả lập, bạn có thể sử dụng đồ họa HD hoặc thậm chí 4K, tận dụng sức mạnh điện toán bổ sung để chơi game ở các cấp độ cao hơn nhiều so với độ phân giải gốc của chúng.
Hãy xem video để biết ví dụ điển hình, sử dụng trình giả lập PCSX2 PlayStation 2 để chơi Gran Turismo 4.
Bạn thậm chí có thể chạy trình giả lập video game trên thiết bị Android của mình, cho phép bạn chơi game cổ điển khi đang di chuyển.
Thử nghiệm các hệ điều hành khác nhau
Thông thường, nếu muốn dùng thử một hệ điều hành mới, bạn sẽ cần phải cài đặt nó vào ổ cứng của mình. Giả lập cho phép bạn chạy một hệ điều hành riêng biệt ngay trên hệ điều hành hiện tại bằng máy ảo.
Có một số lý do tại sao bạn muốn làm điều này. Bạn sẽ không phải lo lắng nếu cài đặt của mình hoạt động sai, vì nó được giới hạn trong môi trường ảo. Đây cũng có thể là lựa chọn duy nhất, nếu bạn muốn dùng thử hệ điều hành không tương thích với phần cứng máy tính của mình. Windows Subsystem for Linux là một ví dụ điển hình.
4. Lĩnh vực sử dụng giả lập nhiều nhất và những bất cập
Trong việc duy trì thông tin kỹ thuật số
Giả lập là một chiến lược trong việc duy trì thông tin kỹ thuật số nhằm chống lại sự lỗi thời. Giả lập tập trung vào việc tái tạo môi trường máy tính ban đầu. Quá trình này có thể tốn thời gian và khó khăn, nhưng rất có giá trị vì nó mang lại khả năng duy trì kết nối chặt chẽ hơn với tính xác thực của đối tượng kỹ thuật số.
Giả lập xử lý môi trường phần cứng và phần mềm gốc của đối tượng kỹ thuật số và tái tạo nó trên máy tính hiện tại. Trình giả lập cho phép người dùng có quyền truy cập vào bất kỳ loại ứng dụng hoặc hệ điều hành nào trên nền tảng hiện tại, giúp phần mềm chạy như trong môi trường ban đầu của nó.
Jeffery Rothenberg, người đề xướng việc sử dụng giả lập như một chiến lược trong việc duy trì thông tin kỹ thuật số, phát biểu rằng: "Phương pháp lý tưởng này sẽ cung cấp một giải pháp dài hạn, có thể mở rộng, chỉ cần thiết kế một lần, phù hợp với mọi trường hợp sử dụng và có khả năng áp dụng đồng bộ đối với tất cả các loại tài liệu và phương tiện".
Ông cũng cho biết thêm rằng việc giả lập có thể áp dụng cho không chỉ các hệ thống lỗi thời, mà còn cả những hệ thống chưa được biết đến trong tương lai. Nói một cách thực tế, khi phiên bản mới của một ứng dụng nhất định được phát hành, thay vì giải quyết các vấn đề tương thích và di chuyển cho mọi đối tượng kỹ thuật số được tạo trong phiên bản trước của ứng dụng đó sang phiên bản mới, ta có thể tạo một trình giả lập cho ứng dụng và cho phép truy cập vào tất cả các thông tin kỹ thuật số trước đó.
Trong nghệ thuật truyền thông mới (New Media Art)
Do cơ bản sử dụng chính các định dạng kỹ thuật số, nghệ thuật truyền thông mới (New Media Art) phụ thuộc rất nhiều vào giả lập. Các nghệ sĩ, như Cory Arcangel, người chuyên phục hồi những công nghệ lạc hậu trong các tác phẩm nghệ thuật, nhận ra tầm quan trọng của một quá trình phi tập trung hóa và phi thể chế hóa nhằm bảo tồn văn hóa kỹ thuật số. Trong nhiều trường hợp, mục tiêu của việc giả lập trong nghệ thuật truyền thông mới là bảo tồn một phương tiện kỹ thuật số, để nó có thể được lưu giữ vô thời hạn và được sao chép mà không gặp bất kỳ trục trặc nào, nghĩa là không có sự phụ thuộc vào phần cứng đang dần xuống cấp và trở nên lỗi thời. Nhưng nghịch lý là việc giả lập và trình giả lập lại phải được thiết kế để hoạt động trên các máy tính trong tương lai.
Việc thiết kế hệ thống trong tương lai
Kỹ thuật giả lập thường được sử dụng trong quá trình thiết kế và phát triển các hệ thống mới. Việc giả lập làm quá trình phát triển dễ dàng hơn bằng cách cung cấp khả năng phát hiện, tái tạo và sửa chữa các lỗi trong thiết kế, thậm chí cả trước khi hệ thống thực sự được xây dựng. Kỹ thuật này đặc biệt hữu ích trong việc thiết kế những hệ thống đa lõi, trong đó các lỗi xảy ra đồng thời rất khó phát hiện và sửa chữa nếu không có môi trường được kiểm soát do phần cứng ảo cung cấp. Giả lập cũng cho phép phát triển phần mềm trước khi phần cứng sẵn sàng đáp ứng ra đời, giúp xác nhận các quyết định thiết kế có đúng đắn hay không.
Những bất cập cần giải quyết
- Sở hữu trí tuệ - Nhiều nhà cung cấp công nghệ đã triển khai những tính năng không theo chuẩn trong quá trình phát triển chương trình để tạo dựng vị trí của mình trên thị trường, đồng thời áp dụng các nâng cấp liên tục để duy trì tính cạnh tranh. Mặc dù điều này có thể thúc đẩy ngành công nghệ phát triển và tăng thị phần của nhà cung cấp, nhưng nó khiến người dùng phải đối mặt với những “cơn ác mộng” trong việc duy trì thông tin kỹ thuật số, với ít tài liệu hỗ trợ do tính chất độc quyền của phần cứng và phần mềm.
- Luật bản quyền chưa có hiệu lực để giải quyết việc lưu tài liệu và thông số kỹ thuật của phần mềm và phần cứng độc quyền trong một mô-đun giả lập.
- Trình giả lập thường được sử dụng như một công cụ vi phạm bản quyền, vì chúng cho phép người dùng chơi game video mà không phải mua console và gần như không có bất kỳ nỗ lực nào để ngăn chặn việc sử dụng những bản sao bất hợp pháp. Điều này dẫn đến những bất ổn về mặt pháp lý liên quan đến việc giả lập. Nhiều phần mềm được lập trình để từ chối hoạt động nếu máy chủ biết đó là trình giả lập. Một số game video đặc biệt sẽ tiếp tục chạy, nhưng không cho phép người chơi tiếp tục phần cuối của game. Những biện pháp bảo vệ này khiến việc thiết kế trình giả lập trở nên khó khăn hơn. Các nhà phát triển phải đảm bảo trình giả lập được thiết kế đủ chính xác để không kích hoạt các biện pháp bảo vệ nêu trên.
- Trình giả lập yêu cầu phần cứng tốt hơn hệ thống ban đầu.
Bạn nên đọc
-
5 trình giả lập Android cho Linux tốt nhất
-
Cách mở nhiều giả lập NoxPlayer cùng lúc
-
6 phần mềm VPN miễn phí tốt nhất cho PC
-
So sánh VirtualBox, VMWare và Hyper-V
-
8 phần mềm giả lập PlayStation tốt nhất cho PC 2024
-
Top 7 phần mềm giả lập PC trên Android
-
20 phần mềm giả lập Android tốt nhất cho Windows 2024
-
Emupedia: Cách chơi game Windows 95, 98 không cần phần mềm giả lập
-
Cách giả lập CASIO FX-580VN X trên máy tính, điện thoại
- Duy NguyễnThích · Phản hồi · 0 · 28/04/23
Cũ vẫn chất
-
Cách mở file HEIC trên Windows
Hôm qua -
Windows + V: Phím tắt hữu ích mà nhiều người dùng Windows không biết
Hôm qua -
Top chuột không dây tốt nhất năm 2024
Hôm qua 1 -
Hướng dẫn tìm Telegram ID cá nhân
Hôm qua -
Khám phá 7 con mắt trong Naruto và Boruto
Hôm qua -
Cách bật đèn bàn phím laptop, kích hoạt Keyboard Backlight trên Windows 10
Hôm qua -
Cách tải video Google Drive bị chặn download
Hôm qua -
Cách cố định ảnh chèn trong Excel
Hôm qua -
1314 là gì?
Hôm qua -
Emupedia: Cách chơi game Windows 95, 98 không cần phần mềm giả lập
Hôm qua