X86 talimatları kendi kodlamalarının yanı sıra tüm argümanlarının aynı anda bellekte bulunmasını gerektirir mi?


64

RAM'i sadece tek bir fiziksel sayfa tarafından desteklenen bir Linux VM çalıştırmanın mümkün olup olmadığını anlamaya çalışıyorum.

Bunu simüle etmek için, KVM'deki iç içe sayfa hata işleyicisini, geçerli biti işlenmiş sayfa hatasına karşılık gelen dışında tüm iç içe sayfa tablosu (NPT) girişlerinden kaldırmak üzere değiştirdim.

Bir Linux misafirini başlatmaya çalışırken, bellek işlenenlerini kullanan montaj talimatlarının

add [rbp+0x820DDA], ebp

talimatı içeren sayfanın yanı sıra işlenende (bu örnekte [rbp+0x820DDA]) başvurulan sayfa için mevcut biti geri yükleyene kadar bir sayfa hatası döngüsüne yol açar .

Neden böyle olduğunu merak ediyorum. CPU bellek sayfalarına sırayla erişmemeli, yani önce talimatı okumalı ve sonra bellek işlenene erişmeli mi? Veya x86, talimat sayfasına ve tüm işlenen sayfalara aynı anda erişilebilir olmasını gerektiriyor mu?

AMD Zen 1 üzerinde test yapıyorum.


2
Bunu neden yapmak istiyorsun?
SS Anne

11
Teknik ilgi alanı dışında :)
savvybug

14
Komik proje fikri için upvoting.
boru

10
Bu, "tarayıcıda JavaScript'te çalışan 486 öykünücüsüne Linux önyükleme" düzeyinde deliliktir. Onu seviyorum.
chrylis -on strike-

3
Heh, görünüşe göre bu soruyu, düşündüğünüzle aynı mantıklı sonuca, garantili ileri ilerleme için asgari çalışma setine götürdüm. Soruna yeni ilk paragrafı eklemeden önce bunu zaten yanıtlamıştım. : PI, birkaç noktaya bazı bağlantılar ve daha fazla ayrıntı ekledi (örneğin, sayfa yürüteç, bazı konuk sayfa dizini girişlerini dahili olarak önbelleğe almasına izin verilir), çünkü bu soru HNQ'ya bir şekilde yaptığı için beklediğimden çok daha fazla dikkat çekiyor.
Peter Cordes

Yanıtlar:


56

Evet, makine kodu ve tüm bellek işlenenlerini gerektirirler.

CPU bellek sayfalarına sırayla erişmemeli, yani önce talimatı okumalı ve sonra bellek işlenene erişmeli mi?

Evet, mantıksal olarak olan budur, ancak sayfa hatası istisnası bu 2 adımlı işlemi kesintiye uğratır ve herhangi bir ilerlemeyi atar. CPU, bir sayfa hatası oluştuğunda hangi talimatın olduğunu hatırlamanın bir yolunu yoktur.

Geçerli bir sayfa hatası işlendikten sonra bir sayfa hatası işleyicisi döndüğünde, RIP = hata talimatının adresi, böylece CPU sıfırdan çalıştırmayı yeniden dener .

İşletim sisteminin irethata talimatının makine kodunu değiştirmesi ve sayfa hatası işleyicisinden (veya başka bir istisna veya kesinti işleyicisinden) farklı bir talimat vermesini beklemesi yasal olacaktır . Bu yüzden AFAIK, mimari olarak, söz konusu olması durumunda CPU'nun CS: RIP'den kod getirmeyi yeniden yapmasını gerektiriyor. (Sabit sayfa hatası durumunda disk beklerken başka bir işlem zamanlamak veya geçersiz sayfa hatası durumunda bir sinyal işleyiciye SIGSEGV iletmek yerine hatalı CS: RIP'ye bile geri döndüğü varsayılarak.)

Muhtemelen hiper denetimci giriş / çıkışı için mimari olarak da gereklidir. Ve kağıt üzerinde açıkça yasak olmasa bile, CPU'lar bu şekilde çalışmaz.

@torek, bazı (CISC) mikroişlemcilerin talimatları kısmen çözdüğünü ve bir sayfa hatasına mikro kayıt durumunu döktüğünü , ancak x86'nın böyle olmadığını söylüyor.


Birkaç talimat kesilebilir ve kısmi ilerleme yapabilir rep movs(örneğin bir kutuda memcpy) ve diğer dize talimatları veya yük / dağıtım depoları toplayabilir. Ancak tek mekanizma string ops için RCX / RSI / RDI gibi mimari kayıtların veya toplar için hedef ve maske kayıtlarının güncellenmesidir (örn . AVX2vpgatherdd için manuel ). Opcode / kod çözme işleminin saklanmaması bazı gizli dahili kayıtlara neden olur ve sayfa hatası işleyicisinden iret sonrasında yeniden başlatır. Bunlar, birden fazla ayrı veri erişimi yapan talimatlardır.

Ayrıca, x86'nın (çoğu ISA gibi), talimatların atomik wrt olduğunu garanti ettiğini unutmayın. kesmeler / istisnalar: Kesmeden önce ya tamamen olurlar ya da hiç olmazlar. Bir montaj talimatını çalışırken durdurma . Bu nedenle, örneğin add [mem], reg, lockön bölüm olmasa bile, depo parçası arızalanırsa yükü atmak gerekecektir .


İlerlemek için mevcut en kötü konuk kullanıcı alanı sayfa sayısı 6 (artı her biri için ayrı konuk çekirdeği sayfa tablosu alt ağaçları) olabilir:

  • movsqveya movswsayfa sınırını kapsayan 2 baytlık bir talimat olduğundan, kod çözmesi için her iki sayfanın da gereklidir.
  • qword kaynak işleneni [rsi]de bir sayfa-ayrımı
  • qword hedef işleneni [rdi]de bir sayfa-ayrımı

Bu 6 sayfadan herhangi biri hatalıysa, tekrar bir kareye geri döneriz.

rep movsdaynı zamanda 2 baytlık bir talimattır ve bir adımda ilerleme kaydedilmesi aynı gereksinime sahip olacaktır. Yanlış hizalanmış bir yığın gibi push [mem]veya pop [mem]bunlarla oluşturulabilecek benzer durumlar .

Toplama yükleri / dağılma depolarını "kesilebilir" (maske vektörünü ilerlemeleriyle güncellemek) / yapmanın nedenlerinden (veya yan faydalarından) biri, tek bir komut yürütmek için bu minimum ayak izini arttırmaktan kaçınmaktır. Ayrıca bir toplama veya saçılma sırasında birden fazla hatayı işleme verimliliğini artırmak için.


@Brandon , konukların bellekte sayfa tablolarına ihtiyaç duyacağına ve kullanıcı alanı sayfa bölümlerinin de 1GiB bölünmeleri olabileceğine dikkat çekerek iki tarafın en üst düzey PML4'ün farklı alt ağaçlarında yer aldığını belirtiyor. HW sayfa ilerlemesi, ilerleme kaydetmek için bu konuk sayfa tablosu sayfalarının tümüne dokunmalıdır. Bu patolojik durumun tesadüfen gerçekleşmesi muhtemel olmayan bir durum.

TLB'nin (ve sayfa yürüteç içlerinin) sayfa tablosu verilerinin bazılarını önbelleğe almasına izin verilir ve işletim sistemi invlpgyeni bir CR3 üst düzey sayfa dizini ayarlamadığı sürece sayfa yürüyüşünü sıfırdan yeniden başlatmaları gerekmez . Bir sayfayı mevcut olmayandan günümüze değiştirirken bunlardan hiçbiri gerekli değildir; Kağıt üzerinde x86 gerekli olmadığını garanti eder (bu nedenle mevcut olmayan PTE'lerin "negatif önbelleğe alınmasına" izin verilmez, en azından yazılım tarafından görülemez). Dolayısıyla, konuk-fiziksel sayfa tablosu sayfalarından bazıları gerçekte mevcut olmasa bile CPU VMexit olmayabilir.

PMU performans sayaçları , talimatın gerektirdiği şekilde etkinleştirilebilir ve yapılandırılabilir için söz konusu talimat için bir PEBS arabelleğine yazma işlemi için mükemmel bir olay . Çekirdek değil, yalnızca kullanıcı alanı talimatlarını sayacak şekilde yapılandırılmış bir sayaç maskesiyle, kullanıcı alanına her döndüğünüzde sayacı taşmaya ve tamponda bir örnek depolamaya çalışarak bir sayfa hatası oluşturabilir.


15
Tek bir komut için en kötü durum, "sayfa dizini işaretçi tablosu sınırı" boyunca ("6 sayfaya kadar, 6 sayfa tablosu, 6 sayfa dizini, 6 PDPT ve bir PML4 eklenmesi) " push dword [foo"(hatta sadece call [foo]) gibi bir şey olabilir ; CPU'nun "PEBS arabelleği ile kesin olay tabanlı örnekleme" özelliği etkinleştirilmiş ve yapılandırılmış, böylece pushperformans izleme verilerinin PEBS arabelleğine eklenmesine neden olur. Muhafazakar bir "ev sahibi tarafından sağlanan minimum sayfa böylece konuk patolojik durumlarda ilerleme yapabilirsiniz" en az 16 sayfa istiyorum.
Brendan

4
Bu tür şeylerin CISC-y mimarilerinde her zaman yaygın olduğunu unutmayın. Bazı mikroişlemciler komutları kısmen deşifre eder ve bir sayfa arızasına mikro kayıt durumunu atar, ancak diğerleri "loop-y" talimatları (m68k'de DBRA, Vax'ta MOVC3 / MOVC5, vb.) REP MOVS örneğiniz için.
torek

1
@Brendan: Birisi bir VAX talimatında en kötü vakayı yaklaşık 50 sayfa olarak saydı. Ayrıntıları unuttum, ancak talimatın kendisini bir sayfa sınırına koyarsınız, sayfa sınırını kapsayan tabloyla translate tablo araması gibi bir şey kullanırsınız, sayfa sınırlarında dolaylı öğelerle (rX) [rY] kullanın ve yakında. En kirli talimatlar 6 operandı aldı (r0-r5'e yüklüyor) ve altısının hepsi çift dolaylı olabilir.
torek

3
İşletim sistemi talimatı değiştirebilir, ancak değişebilir EIP. Dolayısıyla mantıklı bir takip sorusu var. Akıllı talimat düzeltme eki şemasını varsayarak gereken minimum sayfa sayısı nedir? Örneğin, hizalanmamış değeri hizalanmış bir çizik tamponuna kopyalayın, talimatı taklit edin ve bir sonraki talimata IRET uygulayın.
MSalters

1
İşletim sisteminin irettalimatlarını içeren sayfanın da bellekte olması gerekir. Bu bir baytlık talimattır, bu yüzden fazladan bir sayfa. Sayfa hatası işleyici kesme adresinin de bellekte olması gerekir, ancak bu yukarıdakiyle aynı sayfa olabilir.
Stig Hemmer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.