Trình mô phỏng hệ thống máy tính: trình mô phỏng toàn nền tảng quen thuộc và chưa biết theo chiều kim đồng hồ và dấu vết

Trong phần thứ hai của bài viết về trình mô phỏng hệ thống máy tính, tôi sẽ tiếp tục nói dưới dạng giới thiệu đơn giản về trình mô phỏng máy tính, cụ thể là về mô phỏng toàn nền tảng mà người dùng bình thường thường gặp nhất, cũng như về đồng hồ. -mô hình và dấu vết đồng hồ, phổ biến hơn trong giới nhà phát triển.

Trình mô phỏng hệ thống máy tính: trình mô phỏng toàn nền tảng quen thuộc và chưa biết theo chiều kim đồng hồ và dấu vết

В phần đầu tiên Tôi đã nói về mô phỏng nói chung là gì, cũng như về các cấp độ mô phỏng. Bây giờ, dựa trên kiến ​​​​thức đó, tôi đề xuất tìm hiểu sâu hơn một chút và nói về mô phỏng toàn nền tảng, cách thu thập dấu vết, những việc cần làm sau này với chúng, cũng như về mô phỏng vi kiến ​​​​trúc theo từng đồng hồ.

Trình mô phỏng toàn nền tảng hoặc “Một mình trên chiến trường không phải là chiến binh”

Nếu bạn muốn nghiên cứu hoạt động của một thiết bị cụ thể, chẳng hạn như card mạng, viết chương trình cơ sở hoặc trình điều khiển cho thiết bị này, thì thiết bị đó có thể được mô phỏng riêng. Tuy nhiên, việc sử dụng nó tách biệt với phần còn lại của cơ sở hạ tầng sẽ không thuận tiện lắm. Để chạy trình điều khiển tương ứng, bạn sẽ cần bộ xử lý trung tâm, bộ nhớ, quyền truy cập vào bus dữ liệu, v.v. Ngoài ra, trình điều khiển cần có hệ điều hành (OS) và ngăn xếp mạng để hoạt động. Ngoài ra, có thể cần có một trình tạo gói và máy chủ phản hồi riêng.

Trình mô phỏng toàn nền tảng tạo ra một môi trường để chạy một ngăn xếp phần mềm hoàn chỉnh, bao gồm mọi thứ từ BIOS và bộ tải khởi động đến chính hệ điều hành và các hệ thống con khác nhau của nó, chẳng hạn như cùng một ngăn xếp mạng, trình điều khiển và các ứng dụng ở cấp độ người dùng. Để làm điều này, nó triển khai các mô hình phần mềm của hầu hết các thiết bị máy tính: bộ xử lý và bộ nhớ, đĩa, thiết bị đầu vào/đầu ra (bàn phím, chuột, màn hình), cũng như cùng một card mạng.

Dưới đây là sơ đồ khối của chipset x58 của Intel. Trình mô phỏng máy tính toàn nền tảng trên chipset này yêu cầu triển khai hầu hết các thiết bị được liệt kê, bao gồm các thiết bị bên trong IOH (Trung tâm đầu vào/đầu ra) và ICH (Trung tâm điều khiển đầu vào/đầu ra), không được mô tả chi tiết trên sơ đồ khối . Mặc dù, như thực tế cho thấy, không có nhiều thiết bị không được sử dụng bởi phần mềm mà chúng tôi sắp chạy. Không cần phải tạo mô hình của các thiết bị như vậy.

Trình mô phỏng hệ thống máy tính: trình mô phỏng toàn nền tảng quen thuộc và chưa biết theo chiều kim đồng hồ và dấu vết

Thông thường, trình mô phỏng toàn nền tảng được triển khai ở cấp hướng dẫn bộ xử lý (ISA, xem bên dưới). bài báo trước). Điều này cho phép bạn tự tạo trình giả lập tương đối nhanh chóng và không tốn kém. Cấp độ ISA cũng tốt vì nó ít nhiều không thay đổi, không giống như cấp độ API/ABI, cấp độ này thay đổi thường xuyên hơn. Ngoài ra, việc triển khai ở cấp độ hướng dẫn cho phép bạn chạy cái gọi là phần mềm nhị phân chưa sửa đổi, nghĩa là chạy mã đã được biên dịch mà không có bất kỳ thay đổi nào, chính xác như được sử dụng trên phần cứng thực. Nói cách khác, bạn có thể tạo một bản sao (“kết xuất”) ổ cứng của mình, chỉ định nó làm hình ảnh cho một mô hình trong trình mô phỏng toàn nền tảng và thì đấy! – Hệ điều hành và các chương trình khác được tải vào trình mô phỏng mà không cần thực hiện thêm bất kỳ hành động nào.

Hiệu suất mô phỏng

Trình mô phỏng hệ thống máy tính: trình mô phỏng toàn nền tảng quen thuộc và chưa biết theo chiều kim đồng hồ và dấu vết

Như đã đề cập ở trên, quá trình mô phỏng toàn bộ hệ thống, tức là tất cả các thiết bị của nó, là một công việc khá chậm. Nếu bạn cũng triển khai tất cả những điều này ở mức độ rất chi tiết, chẳng hạn như vi kiến ​​trúc hoặc logic, thì việc thực thi sẽ trở nên cực kỳ chậm. Nhưng mức độ hướng dẫn là một lựa chọn thích hợp và cho phép hệ điều hành và các chương trình thực thi ở tốc độ đủ để người dùng tương tác với chúng một cách thoải mái.

Ở đây sẽ thích hợp để đề cập đến chủ đề về hiệu suất của trình mô phỏng. Nó thường được đo bằng IPS (lệnh mỗi giây), chính xác hơn là bằng MIPS (triệu IPS), nghĩa là số lượng lệnh bộ xử lý được trình mô phỏng thực thi trong một giây. Đồng thời, tốc độ mô phỏng cũng phụ thuộc vào hiệu suất của hệ thống mà mô phỏng chạy trên đó. Do đó, có thể đúng hơn khi nói về “sự chậm lại” của trình mô phỏng so với hệ thống ban đầu.

Các trình mô phỏng toàn nền tảng phổ biến nhất trên thị trường, chẳng hạn như QEMU, VirtualBox hoặc VmWare Workstation, đều có hiệu suất tốt. Người dùng thậm chí có thể không nhận thấy rằng công việc đang diễn ra trong trình mô phỏng. Điều này xảy ra nhờ vào khả năng ảo hóa đặc biệt được triển khai trong bộ xử lý, thuật toán dịch nhị phân và những điều thú vị khác. Đây hoàn toàn là một chủ đề cho một bài viết riêng, nhưng tóm lại, ảo hóa là một tính năng phần cứng của bộ xử lý hiện đại cho phép trình mô phỏng không mô phỏng các lệnh mà gửi chúng để thực thi trực tiếp đến bộ xử lý thực, tất nhiên, nếu kiến ​​trúc của trình mô phỏng và bộ xử lý tương tự nhau. Dịch nhị phân là dịch mã máy khách thành mã máy chủ và thực thi tiếp theo trên bộ xử lý thực. Kết quả là quá trình mô phỏng chỉ chậm hơn một chút, từ 5-10 lần và thậm chí thường chạy ở tốc độ tương đương với hệ thống thực. Mặc dù điều này bị ảnh hưởng bởi nhiều yếu tố. Ví dụ: nếu chúng ta muốn mô phỏng một hệ thống có vài chục bộ xử lý, thì tốc độ sẽ ngay lập tức giảm xuống vài chục lần. Mặt khác, các trình mô phỏng như Simics trong các phiên bản mới nhất hỗ trợ phần cứng máy chủ đa bộ xử lý và song song một cách hiệu quả các lõi mô phỏng với các lõi của bộ xử lý thực.

Nếu chúng ta nói về tốc độ mô phỏng vi kiến ​​​​trúc, thì nó thường có cường độ lớn gấp vài lần, chậm hơn khoảng 1000-10000 lần so với việc thực hiện trên máy tính thông thường mà không cần mô phỏng. Và việc triển khai ở cấp độ các phần tử logic sẽ chậm hơn nhiều bậc. Do đó, FPGA được sử dụng làm trình mô phỏng ở cấp độ này, điều này có thể tăng hiệu suất đáng kể.

Biểu đồ bên dưới thể hiện sự phụ thuộc gần đúng của tốc độ mô phỏng vào chi tiết mô hình.

Trình mô phỏng hệ thống máy tính: trình mô phỏng toàn nền tảng quen thuộc và chưa biết theo chiều kim đồng hồ và dấu vết

Mô phỏng từng nhịp

Mặc dù tốc độ thực thi thấp nhưng các trình mô phỏng kiến ​​trúc vi mô khá phổ biến. Việc mô phỏng các khối bên trong của bộ xử lý là cần thiết để mô phỏng chính xác thời gian thực hiện của mỗi lệnh. Sự hiểu lầm có thể nảy sinh ở đây - xét cho cùng, có vẻ như tại sao không đơn giản lập trình thời gian thực hiện cho mỗi lệnh. Nhưng một trình mô phỏng như vậy sẽ rất không chính xác, vì thời gian thực hiện của cùng một lệnh có thể khác nhau giữa các cuộc gọi.

Ví dụ đơn giản nhất là lệnh truy cập bộ nhớ. Nếu vị trí bộ nhớ được yêu cầu có sẵn trong bộ đệm thì thời gian thực hiện sẽ ở mức tối thiểu. Nếu thông tin này không có trong bộ đệm (“cache miss”) thì điều này sẽ làm tăng đáng kể thời gian thực hiện lệnh. Vì vậy, cần có một mô hình bộ đệm để mô phỏng chính xác. Tuy nhiên, vấn đề không chỉ giới hạn ở mô hình bộ đệm. Bộ xử lý sẽ không chỉ đợi dữ liệu được lấy ra từ bộ nhớ khi nó không có trong bộ đệm. Thay vào đó, nó sẽ bắt đầu thực hiện các lệnh tiếp theo, chọn những lệnh không phụ thuộc vào kết quả đọc từ bộ nhớ. Đây được gọi là quá trình thực thi “không theo thứ tự” (OOO, thực thi không theo thứ tự), cần thiết để giảm thiểu thời gian nhàn rỗi của bộ xử lý. Việc lập mô hình các khối xử lý tương ứng sẽ giúp tính đến tất cả những điều này khi tính toán thời gian thực hiện các lệnh. Trong số các lệnh này, được thực thi trong khi chờ kết quả đọc từ bộ nhớ, thao tác nhảy có điều kiện có thể xảy ra. Nếu hiện tại không xác định được kết quả của điều kiện, thì bộ xử lý một lần nữa không dừng thực thi mà thực hiện "đoán", thực hiện nhánh thích hợp và tiếp tục chủ động thực hiện các hướng dẫn từ điểm chuyển tiếp. Khối như vậy, được gọi là bộ dự đoán nhánh, cũng phải được triển khai trong trình mô phỏng vi kiến ​​trúc.

Hình dưới đây hiển thị các khối chính của bộ xử lý, không cần thiết phải biết về nó, nó chỉ được hiển thị để hiển thị mức độ phức tạp của việc triển khai vi kiến ​​trúc.

Trình mô phỏng hệ thống máy tính: trình mô phỏng toàn nền tảng quen thuộc và chưa biết theo chiều kim đồng hồ và dấu vết

Hoạt động của tất cả các khối này trong bộ xử lý thực được đồng bộ hóa bằng các tín hiệu đồng hồ đặc biệt và điều tương tự cũng xảy ra trong mô hình. Một mô phỏng vi kiến ​​trúc như vậy được gọi là chu trình chính xác. Mục đích chính của nó là dự đoán chính xác hiệu suất của bộ xử lý đang được phát triển và/hoặc tính toán thời gian thực hiện của một chương trình cụ thể, chẳng hạn như điểm chuẩn. Nếu các giá trị thấp hơn yêu cầu thì cần phải sửa đổi các thuật toán và khối xử lý hoặc tối ưu hóa chương trình.

Như đã trình bày ở trên, mô phỏng theo từng đồng hồ rất chậm, do đó nó chỉ được sử dụng khi nghiên cứu một số thời điểm nhất định trong hoạt động của chương trình, khi cần tìm ra tốc độ thực hiện chương trình thực và đánh giá hiệu suất trong tương lai của thiết bị có nguyên mẫu đang được mô phỏng.

Trong trường hợp này, một trình mô phỏng chức năng được sử dụng để mô phỏng thời gian chạy còn lại của chương trình. Sự kết hợp sử dụng này diễn ra như thế nào trong thực tế? Đầu tiên, trình mô phỏng chức năng được khởi chạy, trên đó hệ điều hành và mọi thứ cần thiết để chạy chương trình đang nghiên cứu được tải. Rốt cuộc, chúng tôi không quan tâm đến bản thân hệ điều hành cũng như giai đoạn đầu khởi chạy chương trình, cấu hình của nó, v.v. Tuy nhiên, chúng ta cũng không thể bỏ qua những phần này và chuyển ngay sang thực hiện chương trình từ giữa. Do đó, tất cả các bước sơ bộ này đều được chạy trên một trình mô phỏng chức năng. Sau khi chương trình được thực hiện đến thời điểm chúng tôi quan tâm, có thể có hai lựa chọn. Bạn có thể thay thế mô hình bằng mô hình theo từng chu kỳ và tiếp tục thực hiện. Chế độ mô phỏng sử dụng mã thực thi (nghĩa là các tệp chương trình được biên dịch thông thường) được gọi là mô phỏng điều khiển thực thi. Đây là tùy chọn mô phỏng phổ biến nhất. Một cách tiếp cận khác cũng có thể thực hiện được - mô phỏng theo hướng.

Mô phỏng dựa trên dấu vết

Nó bao gồm hai bước. Sử dụng trình mô phỏng chức năng hoặc trên hệ thống thực, nhật ký hành động của chương trình được thu thập và ghi vào tệp. Nhật ký này được gọi là dấu vết. Tùy thuộc vào nội dung đang được kiểm tra, dấu vết có thể bao gồm các hướng dẫn thực thi, địa chỉ bộ nhớ, số cổng và thông tin ngắt.

Bước tiếp theo là “phát” dấu vết, khi trình mô phỏng theo từng đồng hồ đọc dấu vết và thực hiện tất cả các hướng dẫn được ghi trong đó. Cuối cùng, chúng tôi nhận được thời gian thực hiện của phần chương trình này, cũng như các đặc điểm khác nhau của quy trình này, chẳng hạn như tỷ lệ phần trăm lần truy cập trong bộ đệm.

Một tính năng quan trọng khi làm việc với dấu vết là tính tất định, tức là bằng cách chạy mô phỏng theo cách được mô tả ở trên, chúng ta tái tạo lặp đi lặp lại cùng một chuỗi hành động. Điều này có thể thực hiện được bằng cách thay đổi các tham số mô hình (kích thước bộ đệm, bộ đệm và hàng đợi) và sử dụng các thuật toán nội bộ khác nhau hoặc điều chỉnh chúng để nghiên cứu cách một tham số cụ thể ảnh hưởng đến hiệu suất hệ thống và tùy chọn nào mang lại kết quả tốt nhất. Tất cả điều này có thể được thực hiện bằng mô hình thiết bị nguyên mẫu trước khi tạo nguyên mẫu phần cứng thực tế.

Sự phức tạp của phương pháp này nằm ở chỗ trước tiên cần phải chạy ứng dụng và thu thập dấu vết cũng như kích thước khổng lồ của tệp dấu vết. Ưu điểm bao gồm thực tế là chỉ cần mô phỏng phần thiết bị hoặc nền tảng quan tâm là đủ, trong khi mô phỏng bằng cách thực thi thường yêu cầu một mô hình hoàn chỉnh.

Vì vậy, trong bài viết này, chúng tôi đã xem xét các tính năng của mô phỏng toàn nền tảng, nói về tốc độ triển khai ở các cấp độ khác nhau, mô phỏng và theo dõi theo từng chu kỳ. Trong bài viết tiếp theo, tôi sẽ mô tả các tình huống chính khi sử dụng trình mô phỏng, cho cả mục đích cá nhân và từ quan điểm phát triển ở các công ty lớn.

Nguồn: www.habr.com

Thêm một lời nhận xét