Fiziksel doğrusal adresteki VGA metin (mod 03) çerçeve arabelleğine (0x31) gibi bir bayt depoladığınızda 16 bit eski BIOS MBR modunda önyüklenen modern PC donanımında gerçekten ne olur ? Bu bölge için MTRR olan bir mağaza UC'ye ne kadar yavaş ayarlanmış? ( Deneysel bir Kaby Gölü iGPU dizüstü test WC o clflushopt VGA bellek için UC kabaca aynı hızda olduğunu gösteriyor. Ama clflushopt olmadan, WC belleğine kaydeder süper hızlı koşma, CPU asla terk ve hiç ekranı güncelleme yok .)'1'
B8000
mov [es:di], eax
mov
Her mağaza için bir SMI değilse, gerçek modda yeniden başlatılmadan performans deneyleri için, kullanıcı alanındaki WB bellek yığınındaki bu maliyeti yaklaşık olarak tahmin etmenin bir yolu var mı? (örneğin, gerçekte hiçbir yerde görüntülenmeyen bir BSS sayfasını taklit çerçeve tamponu olarak kullanma).
İlgili yazı tipi glifi bir sonraki yenilemede ekranda görünür, ancak donanım taraması gerçekten VRAM'den (veya bir iGPU için DRAM'den) ASCII karakterini okuyor ve anında bitmap yazı tipi glifleriyle eşleştiriyor mu? Ya da her mağazada veya vblank başına bir kez yazılım müdahalesi var, bu yüzden gerçek donanım sadece bit eşlemli bir çerçeve arabelleğini işlemek zorunda mı?
Eski BIOS önyüklemesinin USB kbd / fareyi PS / 2 cihazları olarak taklit etmek için Sistem Yönetim Modu'nu (SMM) kullandığı bilinmektedir . VGA metin modu çerçeve arabelleği için de kullanılıp kullanılmadığını merak ediyorum. Mod ayarı için VGA I / O portları için kullanıldığını varsayıyorum , ancak bir metin çerçevesinin donanım tarafından desteklenebileceği akla yatkın. Ancak, çoğu bilgisayar tüm zamanlarını grafik modunda geçirir, bu nedenle metin modu için HW desteğini bırakmak satıcıların yapmak isteyebileceği bir şey gibi görünür. (OTOH bu blog , bir homebrew verilog VGA denetleyicisinin metin modunu oldukça basit bir şekilde uygulayabileceğini önermektedir.)
Özellikle Intel Skylake'te iGPU kullanan sistemlerle ilgileniyorum, ancak Intel ve AMD'nin önceki / sonraki iGPU'ları ve yeni veya eski ayrık GPU'lar ile ilgileniyorum.
(AMD ve NVidia dışındaki satıcılar dahil; PCIe değil, PCI yuvalarına sahip bazı Skylake anakartlar vardır. Modern GPU ürün yazılımı sürücüleri metin modunu taklit ederse, muhtemelen donanım VGA metin moduna sahip bazı eski PCI ekran kartları vardır. mağazaların bir SMI yerine bir PCI işlemi olmasını sağlayabilir.)
Kendi masaüstüm Asus Z170 Pro Gaming mobo'da bir i7-6700k, eklenti kartı yok sadece DVI-D çıkışında 1920x1200 monitörlü iGPU. @Edan'ın test ettiği Kaby Lake i5-7300HQ sisteminin detaylarını bilmiyorum, sadece CPU modeli.
Buldum Phoenix BIOS en patent US20120159520 2011 yılından ,
UEFI kullanarak eski videoyu öykünen . Bunun yerine UEFI'yi hem tedarik Video donanım satıcıları gerektiren bir ve yerli 16-bit gerçek mod seçeneği-ROM sürücüleri, bunlar gerçek mod VGA sürücüsünü (teklif int 10h
SMM kancalar vasıtasıyla bir satıcı tarafından sağlanan UEFI video sürücüsünü çağırır fonksiyonları ve benzeri).
Özet
[...] Genel video seçeneği ROM, genel bir video SMM sürücüsüne video hizmetleri talebini bildirir. Bu bildirim, bir yazılım sistemi yönetim kesmesi (SMI) kullanılarak gerçekleştirilebilir. Bildirim üzerine, genel video SMM sürücüsü üçüncü taraf bir UEFI video sürücüsüne video hizmetleri talebini bildirir. Üçüncü taraf video sürücüsü, işletim sistemine istenen video hizmetlerini sağlar. Bu şekilde, üçüncü taraf bir UEFI grafik sürücüsü, UEFI ekran protokollerini yerel olarak desteklemeyenler de dahil olmak üzere çok çeşitli işletim sistemlerini destekleyebilir.
Açıklamanın çoğu, int 10h
çağrıları ve IVT aracılığıyla zaten açık bir şekilde yakalanan şeyleri ele alır , böylece bir SMI'yi tetikleyen özel kodu kolayca çalıştırabilir. İlgili bölüm, herhangi bir yazılım veya donanım kesintisini tetiklemeyen kodlar için bile çalışması gereken metin modu çerçeve arabelleğine doğrudan mağazalar için tanımladıkları şeydir. (Bu tür mağazalarda SMI'yi tetikleyen HW dışında, desteklendiklerinde kullanabileceklerini söylüyorlar.)
Metin Arabellek Desteği
Bazı düzeneklerde uygulamalar, VGA'nın metin tamponunu doğrudan manipüle edebilir . Böyle bir düzenlemede, jenerik video SMM sürücüsü 130 , donanımın 740 KB-768 KB bellek bölgesine (metin arabelleklerinin bulunduğu yer) okuma / yazma erişiminde SMI yakalama sağlayıp sağlamadığına bağlı olarak bunu iki yoldan biriyle destekler .
SMI yakalama mevcut olduğunda, donanım her okuma veya yazma erişiminde bir SMI oluşturur. SMI tuzağının tuzak adresi kullanılarak, tam metin sütunu ve satırı hesaplanabilir ve sanal metin ekranındaki ilgili satır ve sütuna erişilebilir.
Alternatif olarak, bu bölge için normal bellek etkinleştirilir ve periyodik bir SMI kullanılarak, jenerik video SMM sürücüsü 130 taklit edilmiş donanım metin arabelleğindeki değişiklikleri tarar ve video sürücüsü tarafından tutulan ilgili sanal metin ekranını günceller. Her iki durumda da, bir değişiklik algılandığında, karakter sanal metin ekranında yeniden çizilir.
Bu sadece bir BIOS satıcısının patentidir ve bize çoğu donanımın gerçekte hangi şekilde çalıştığını veya diğer satıcıların farklı şeyler yapıp yapmadığını söylemez. Yine de , bu aralıktaki mağazalarda sıkışabilecek bazı donanımların var olduğunu doğrular. (Bu, patentlerinde ele almaya karar verdikleri varsayımsal bir olasılık olmadığı sürece.)
Aklımda kullandığım kullanım için, sadece ekran yenilemede bindirme her mağazada bindirmekten çok daha hızlı olacaktır, bu yüzden hangi donanımın / ürün yazılımının hangi şekilde çalıştığını merak ediyorum.
Bu soru için motivasyon
7. nesil Intel Core'da video RAM'de artan bir ASCII ondalık sayacını optimize etme - bir ASCII metin sayacı için yeni basamakları aynı birkaç bayt video RAM'e tekrar tekrar kaydetme.
Kodun bir sürümünü Linux altında 32 bit kullanıcı alanında, WB bellekte, duruma yaklaşık olarak yaklaşmayı movnti
ve CPU'nun WC arabelleğini her mağazadan sonra (veya belki de zaman zaman bir zamanlayıcı kesmesi). Ancak, gerçek mod önyükleyici durumu sadece DRAM'a depolamak değil, bunun yerine bir SMI'yi tetikliyorsa bu gerçekçi değildir.
WB bellekte, movnti
a ile depoları yıkamak, yıkamaktan lock xor byte [esp], 0
biraz daha hızlıdır clflushopt
. Ancak @Eldan, bir MTRR'yi WC yapmak için programladıktan sonra VGA belleğinde olanlar için hız artışı olmadığını bildiriyor. (Ve normal mağazalar yapan orijinalin hızıyla aynıdır, bu da varsayılan olarak VGA çerçeve arabelleğinin UC olduğunu gösterir. Bazı eski BIOS'larda , USWC = Unchached Spekülatif Yazma Kombinasyonu olarak adlandırdıkları VGA belleği WC yapma seçeneği vardı .)
Gerçek bir sorun değil, bu yüzden gerçek çözümler aramıyorum ; piksel baytlarını bir VGA grafik moduna manuel olarak kaydetmenin çok daha hızlı olabileceğini bilmek ilginç olurdu.
özet
- Herhangi bir / tüm gerçek modern sistemler, her mağazada metin modu çerçeve arabelleğine bir SMI tetikliyor mu?
- Hayır ise, WB belleğindeki kullanıcı boşluğunda movnti + bir şey kullanarak çerçeve ara belleğine bir WC deposu + clflush'a yaklaşabilir miyiz? Böylece
perf
performans sayaçları için kolayca profil oluşturabiliriz . - Farklı BIOS'lar ve / veya donanımlar farklı stratejiler kullanıyorsa, bu stratejiler nelerdir? (Ayrıntıları istemiyorum, sadece "SMI her vblank gibi VGA çerçeve tamponunu gerçek donanım çerçeve tamponuyla senkronize etmek" gibi yüksek bir seviye)
- Donanım VGA metin modlu bir PCIe veya PCI ekran kartı, entegre GPU'lardan daha hızlı mıdır? Gerçek bir PCIe yazma işleminin bir mağazanın DRAM'a ulaşmasını beklemekten daha yavaş olacağını düşünüyorum, ancak PCIe yazma işlemi her mağazadaki bir SMI'dan daha ucuz olurdu. Bir basketbol sahası / büyüklük karşılaştırması ilginç olurdu.
Bu soruların hepsi oldukça alakalı, ancak beklediğim kadar fazla çakışma yoksa bunu bölebilirim.
perf
çünkü Linux henüz açılmadı. Linux-CentOS / Intel makinede SMI (Sistem Yönetimi Kesintisi) gecikmesinin değerlendirilmesi, SMI'ları nasıl sayabileceğiniz hakkında bazı ayrıntılara sahiptir.
MSR_SMI_COUNT=0x34
bir sayaç programlamak zorunda kalmadan sadece RDMSR var .