Bilgisayar sistemlerinin simülatörleri: tanıdık bir tam platform simülatörü ve bilinmeyen saat yönünde ve izler

Bilgisayar sistemi simülatörleri ile ilgili makalenin ikinci bölümünde, bilgisayar simülatörleri hakkında, yani ortalama bir kullanıcının en sık karşılaştığı tam platform simülasyonundan ve ayrıca saat başı hesaplamadan basit bir giriş formunda bahsetmeye devam edeceğim. -Geliştirici çevrelerde daha yaygın olan saat modeli ve izleri.

Bilgisayar sistemlerinin simülatörleri: tanıdık bir tam platform simülatörü ve bilinmeyen saat yönünde ve izler

В birinci bölüm Genel olarak simülatörlerin ne olduğundan ve simülasyonun düzeylerinden bahsettim. Şimdi, bu bilgiye dayanarak, biraz daha derine dalmayı ve tam platform simülasyonu, izlerin nasıl toplanacağı, onlarla daha sonra ne yapılacağı ve ayrıca saat bazında mikro mimari emülasyon hakkında konuşmayı öneriyorum.

Tam platformlu simülatör veya “Sahada tek başına savaşçı değildir”

Belirli bir cihazın, örneğin bir ağ kartının çalışmasını incelemek veya bu cihaz için ürün yazılımı veya sürücü yazmak istiyorsanız, böyle bir cihaz ayrı olarak simüle edilebilir. Ancak bunu altyapının geri kalanından ayrı olarak kullanmak pek uygun değildir. İlgili sürücüyü çalıştırmak için merkezi bir işlemciye, belleğe, veri yoluna erişime vb. ihtiyacınız olacaktır. Ayrıca sürücünün çalışması için bir işletim sistemi (OS) ve bir ağ yığını gerekir. Ayrıca ayrı bir paket oluşturucuya ve yanıt sunucusuna ihtiyaç duyulabilir.

Tam platformlu bir simülatör, BIOS ve önyükleyiciden işletim sisteminin kendisine ve aynı ağ yığını, sürücüler ve kullanıcı düzeyindeki uygulamalar gibi çeşitli alt sistemlerine kadar her şeyi içeren eksiksiz bir yazılım yığınını çalıştırmak için bir ortam oluşturur. Bunu yapmak için çoğu bilgisayar aygıtının yazılım modellerini uygular: işlemci ve bellek, disk, giriş/çıkış aygıtları (klavye, fare, ekran) ve aynı ağ kartı.

Aşağıda Intel'in x58 yonga setinin blok şeması bulunmaktadır. Bu yonga setindeki tam platformlu bir bilgisayar simülatörü, blok diyagramda ayrıntılı olarak gösterilmeyen IOH (Giriş/Çıkış Merkezi) ve ICH (Giriş/Çıkış Denetleyici Merkezi) içindekiler de dahil olmak üzere listelenen cihazların çoğunun uygulanmasını gerektirir. . Uygulamada görüldüğü gibi çalıştıracağımız yazılım tarafından kullanılmayan çok fazla cihaz yok. Bu tür cihazların modellerinin oluşturulmasına gerek yoktur.

Bilgisayar sistemlerinin simülatörleri: tanıdık bir tam platform simülatörü ve bilinmeyen saat yönünde ve izler

Çoğu zaman, tam platformlu simülatörler işlemci talimat düzeyinde uygulanır (ISA, aşağıya bakın). önceki makale). Bu, simülatörün kendisini nispeten hızlı ve ucuz bir şekilde oluşturmanıza olanak tanır. ISA seviyesi de iyidir çünkü örneğin daha sık değişen API/ABI seviyesinden farklı olarak aşağı yukarı sabit kalır. Ek olarak, talimat seviyesindeki uygulama, değiştirilmemiş ikili yazılımı çalıştırmanıza, yani önceden derlenmiş kodu, tam olarak gerçek donanımda kullanıldığı gibi, hiçbir değişiklik yapmadan çalıştırmanıza olanak tanır. Başka bir deyişle, sabit sürücünüzün bir kopyasını (“döküm”) oluşturabilir, bunu tam platformlu bir simülatörde bir model için görüntü olarak belirtebilirsiniz ve işte! – İşletim sistemi ve diğer programlar herhangi bir ek işlem yapılmadan simülatöre yüklenir.

Simülatör performansı

Bilgisayar sistemlerinin simülatörleri: tanıdık bir tam platform simülatörü ve bilinmeyen saat yönünde ve izler

Yukarıda da belirtildiği gibi, tüm sistemin, yani tüm cihazların simüle edilmesi süreci oldukça yavaş bir iştir. Tüm bunları çok ayrıntılı bir düzeyde, örneğin mikro mimari veya mantıksal olarak uygularsanız, yürütme son derece yavaşlayacaktır. Ancak talimat düzeyi uygun bir seçimdir ve işletim sisteminin ve programların kullanıcının rahatça etkileşime girmesine yetecek hızlarda yürütülmesine olanak tanır.

Burada simülatör performansı konusuna değinmek yerinde olacaktır. Genellikle IPS (saniye başına talimat), daha kesin olarak MIPS (milyon IPS) cinsinden, yani simülatör tarafından bir saniyede yürütülen işlemci talimatlarının sayısıyla ölçülür. Aynı zamanda simülasyonun hızı, simülasyonun üzerinde çalıştığı sistemin performansına da bağlıdır. Dolayısıyla orijinal sisteme kıyasla simülatörün “yavaşlamasından” bahsetmek daha doğru olabilir.

QEMU, VirtualBox veya VmWare Workstation gibi piyasadaki en yaygın tam platformlu simülatörler iyi performansa sahiptir. Simülatörde çalışmanın devam ettiği kullanıcı tarafından fark edilmeyebilir bile. Bu, işlemcilerde uygulanan özel sanallaştırma yetenekleri, ikili çeviri algoritmaları ve diğer ilginç şeyler sayesinde gerçekleşir. Bunların hepsi ayrı bir makalenin konusu, ancak kısacası sanallaştırma, modern işlemcilerin, simülatörlerin talimatları simüle etmelerine değil, elbette mimarileri varsa bunları doğrudan gerçek bir işlemciye yürütülmek üzere göndermelerine olanak tanıyan bir donanım özelliğidir. simülatör ve işlemci benzerdir. İkili çeviri, konuk makine kodunun ana bilgisayar koduna çevrilmesi ve ardından gerçek bir işlemcide çalıştırılmasıdır. Sonuç olarak, simülasyon yalnızca 5-10 kat daha yavaştır ve hatta çoğu zaman gerçek sistemle aynı hızda çalışır. Her ne kadar bu birçok faktörden etkileniyor. Örneğin, birkaç düzine işlemcili bir sistemi simüle etmek istersek, hız hemen birkaç düzine kez düşecektir. Öte yandan, en son sürümlerdeki Simics gibi simülatörler, çok işlemcili ana bilgisayar donanımını destekler ve simüle edilmiş çekirdekleri, gerçek bir işlemcinin çekirdeklerine etkili bir şekilde paralelleştirir.

Mikro mimari simülasyonun hızından bahsedersek, bu genellikle birkaç büyüklük sırasıdır, simülasyon olmadan normal bir bilgisayarda yürütmeden yaklaşık 1000-10000 kat daha yavaştır. Mantıksal öğeler düzeyindeki uygulamalar ise birkaç kat daha yavaştır. Bu nedenle, bu seviyede emülatör olarak bir FPGA kullanılır ve bu da performansı önemli ölçüde artırabilir.

Aşağıdaki grafik simülasyon hızının model detayına yaklaşık bağımlılığını göstermektedir.

Bilgisayar sistemlerinin simülatörleri: tanıdık bir tam platform simülatörü ve bilinmeyen saat yönünde ve izler

Her vuruşta simülasyon

Düşük yürütme hızlarına rağmen mikro mimari simülatörler oldukça yaygındır. Her talimatın yürütme süresini doğru bir şekilde simüle etmek için işlemcinin dahili bloklarının simülasyonu gereklidir. Burada yanlış anlaşılma ortaya çıkabilir - sonuçta, neden her talimatın yürütme süresini programlamıyorsunuz? Ancak böyle bir simülatör çok hatalı olacaktır çünkü aynı talimatın yürütme süresi çağrıdan çağrıya farklılık gösterebilir.

En basit örnek, hafıza erişim talimatıdır. İstenilen hafıza konumu önbellekte mevcutsa, yürütme süresi minimum düzeyde olacaktır. Bu bilgi önbellekte değilse ("önbellek kaybı"), bu, talimatın yürütme süresini büyük ölçüde artıracaktır. Bu nedenle doğru simülasyon için bir önbellek modeline ihtiyaç vardır. Ancak konu önbellek modeliyle sınırlı değil. İşlemci, önbellekte olmadığında verilerin bellekten alınmasını beklemez. Bunun yerine, bellekten okumanın sonucuna bağlı olmayanları seçerek sonraki talimatları yürütmeye başlayacaktır. Bu, işlemcinin boşta kalma süresini en aza indirmek için gerekli olan "sıra dışı" yürütme (OOO, sıra dışı yürütme) olarak adlandırılır. İlgili işlemci bloklarının modellenmesi, talimatların yürütme süresini hesaplarken tüm bunların dikkate alınmasına yardımcı olacaktır. Bellekten okuma sonucu beklenirken yürütülen bu komutlar arasında koşullu atlama işlemi gerçekleşebilir. Durumun sonucu şu anda bilinmiyorsa, işlemci yine yürütmeyi durdurmaz, ancak bir "tahmin" yapar, uygun dallamayı gerçekleştirir ve geçiş noktasından itibaren talimatları proaktif olarak yürütmeye devam eder. Dal tahmincisi olarak adlandırılan böyle bir bloğun mikro mimari simülatörde de uygulanması gerekir.

Aşağıdaki resim işlemcinin ana bloklarını göstermektedir, bunu bilmenize gerek yoktur, yalnızca mikro mimari uygulamanın karmaşıklığını göstermek için gösterilmiştir.

Bilgisayar sistemlerinin simülatörleri: tanıdık bir tam platform simülatörü ve bilinmeyen saat yönünde ve izler

Tüm bu blokların gerçek bir işlemcide çalışması özel saat sinyalleriyle senkronize edilir ve aynı şey modelde de gerçekleşir. Böyle bir mikro mimari simülatöre döngüsel doğruluk denir. Ana amacı, geliştirilmekte olan işlemcinin performansını doğru bir şekilde tahmin etmek ve/veya belirli bir programın (örneğin bir kıyaslama) yürütme süresini hesaplamaktır. Değerler gerekenden düşükse algoritmaları ve işlemci bloklarını değiştirmek veya programı optimize etmek gerekli olacaktır.

Yukarıda gösterildiği gibi, saat bazında simülasyon çok yavaştır, bu nedenle yalnızca programın çalışmasının belirli anlarını incelerken kullanılır; burada program yürütmenin gerçek hızını bulmanın ve cihazın gelecekteki performansını değerlendirmenin gerekli olduğu durumlarda kullanılır. prototip simüle ediliyor.

Bu durumda programın kalan çalışma süresini simüle etmek için işlevsel bir simülatör kullanılır. Bu kullanım kombinasyonu gerçekte nasıl oluyor? İlk olarak, işletim sisteminin ve incelenen programı çalıştırmak için gereken her şeyin yüklendiği işlevsel simülatör başlatılır. Sonuçta, işletim sisteminin kendisi veya programın başlatılmasının ilk aşamaları, konfigürasyonu vb. ile ilgilenmiyoruz. Ancak bu kısımları da atlayıp hemen programın ortasından çalıştırılmasına geçemeyiz. Bu nedenle tüm bu ön adımlar işlevsel bir simülatör üzerinde gerçekleştirilir. Program bizi ilgilendiren ana kadar yürütüldükten sonra iki seçenek mümkündür. Modeli saat bazında bir modelle değiştirebilir ve yürütmeye devam edebilirsiniz. Yürütülebilir kodu (yani normal derlenmiş program dosyalarını) kullanan simülasyon moduna yürütme odaklı simülasyon adı verilir. Bu en yaygın simülasyon seçeneğidir. Başka bir yaklaşım da mümkündür; iz odaklı simülasyon.

İzleme tabanlı simülasyon

İki adımdan oluşur. İşlevsel bir simülatör veya gerçek bir sistem kullanılarak, program eylemlerinin bir günlüğü toplanır ve bir dosyaya yazılır. Bu günlüğe izleme adı verilir. Neyin incelendiğine bağlı olarak izleme, yürütülebilir talimatları, bellek adreslerini, bağlantı noktası numaralarını ve kesme bilgilerini içerebilir.

Bir sonraki adım, saat bazında simülatör izi okuduğunda ve içinde yazılı tüm talimatları yürüttüğünde izi "oynatmaktır". Sonunda, programın bu parçasının yürütme süresinin yanı sıra, bu sürecin çeşitli özelliklerini, örneğin önbellekteki isabet yüzdesini de elde ederiz.

İzlerle çalışmanın önemli bir özelliği determinizmdir, yani simülasyonu yukarıda açıklanan şekilde çalıştırarak aynı eylem dizisini tekrar tekrar üretiriz. Bu, model parametrelerini (önbellek, arabellek ve kuyruk boyutları) değiştirerek ve farklı dahili algoritmalar kullanarak veya bunları ayarlayarak, belirli bir parametrenin sistem performansını nasıl etkilediğini ve hangi seçeneğin en iyi sonuçları verdiğini incelemeyi mümkün kılar. Tüm bunlar, gerçek bir donanım prototipi oluşturmadan önce bir prototip cihaz modeliyle yapılabilir.

Bu yaklaşımın karmaşıklığı, izleme dosyasının büyük boyutunun yanı sıra, öncelikle uygulamayı çalıştırıp izlemeyi toplama ihtiyacından kaynaklanmaktadır. Avantajları arasında cihazın veya platformun yalnızca bir kısmını simüle etmenin yeterli olması, yürütme yoluyla simülasyonun ise genellikle tam bir model gerektirmesi yer almaktadır.

Bu nedenle, bu makalede tam platform simülasyonunun özelliklerine baktık, farklı seviyelerdeki uygulamaların hızından, saat bazında simülasyon ve izlerden bahsettik. Bir sonraki makalede simülatörlerin hem kişisel amaçlarla hem de büyük şirketlerde gelişim açısından kullanılmasına ilişkin ana senaryoları anlatacağım.

Kaynak: habr.com

Yorum ekle