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 iret
hata 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:
movsq
veya movsw
sayfa 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 movsd
aynı 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 invlpg
yeni 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.