X86 işlemciler neden 4 halkadan yalnızca 2 tanesini kullanıyor?


13

Bu nedenle Linux veya Windows tabanlı x86 sistemleri çekirdek modu için yalnızca 0 halkasını ve kullanıcı modu için halka 3'ü kullanır. İşlemciler neden hepsi sadece bunlardan sadece ikisini kullanıyorsa dört farklı halkayı ayırt ediyorlar? Ve bu AMD64 mimarisinde değişti mi?


bu arada, soru başlığının "Neden x86 işletim sistemleri 4 zil sesinden sadece 2'sini kullanıyor?" veya belki "Neden yalnızca x86 işlemcilerdeki işletim sistemleri ...". CPU yalnızca işletim sisteminin söylediklerini yapar.
Jamie Hanrahan

Yanıtlar:


16

Bunun iki temel nedeni vardır.

İlk neden , x86 CPU'ların dört bellek koruması halkası sunmasına rağmen, sunulan korumanın ayrıntı düzeyi yalnızca bölüm başına düzeydedir. Yani, her segment yazma devre dışı gibi diğer korumalarla birlikte 0 ila 3 arasında belirli bir zile ("ayrıcalık düzeyi") ayarlanabilir. Ancak mevcut çok sayıda segment tanımlayıcısı yok. Çoğu işletim sistemi bellek korumasının çok daha küçük bir ayrıntısına sahip olmak ister. Mesela ... bireysel sayfalar için.

Bu nedenle, sayfa tablosu girişlerine (PTE'ler) dayalı koruma girin. Modern x86 işletim sistemlerinin tümü az ya da çok olmasa da bölümleme mekanizmasını göz ardı eder (mümkün olduğu kadar çok) ve PTE tabanlı korumaya güvenir. Bu, her PTE'de daha düşük 12 bit olan bayrak bitleri ve ayrıca yürütmeyi desteklemeyen CPU'larda 63 bit ile belirtilir. Her sayfa için normalde 4K olan bir PTE vardır.

Bu bayrak bitlerinden birine "ayrıcalıklı" bit denir. Bu bit, işlemcinin sayfaya erişmek için "ayrıcalıklı" düzeylerden birinde olup olmayacağını kontrol eder. "Ayrıcalıklı" düzeyler PL 0, 1 ve 2'dir. Ancak bu yalnızca bir bittir, bu nedenle sayfa sayfa koruma düzeyinde, bellek koruması söz konusu olduğunda kullanılabilen "mod" sayısı yalnızca iki: Bir sayfa ayrıcalıksız moddan erişilebilir veya erişilebilir değil. Bu yüzden sadece iki yüzük.

Her sayfa için dört olası zil sesine sahip olmak için, her sayfa tablosu girişinde, olası dört zil numarasından birini kodlamak için (koruma tanımlayıcılarında olduğu gibi) iki koruma bitine sahip olmaları gerekir. Yapmazlar.

İkinci neden OS taşınabilirliğinin hedefidir. Sadece x86 ile ilgili değil; Unix bize bir işletim sisteminin birden fazla işlemci mimarisine nispeten taşınabilir olabileceğini ve bunun iyi bir şey olduğunu öğretti. Ve bazı işlemciler sadece iki halkayı destekler. OS uygulayıcıları, mimarideki çoklu halkalara bağlı kalmadan işletim sistemlerini daha taşınabilir hale getirdi.

Windows NT geliştirmeye özgü üçüncü bir neden var. NT'nin tasarımcıları (Microsoft'un DEC Western Region Labs'tan uzakta kiraladığı David Cutler ve ekibi) VMS konusunda daha önce deneyimlemişti; aslında, Cutler ve diğer birkaçı VMS'nin orijinal tasarımcıları arasındaydı. Ve VMS'nin tasarlandığı VAX işlemcinin (ve tersi) dört halkası var. VMS dört halka kullanır. (Aslında VAX, PTE'de "kullanıcı modundan salt okunur, ancak halka 2 ve iç kısımdan yazılabilir" gibi kombinasyonlara izin veren dört koruma bitine sahiptir.

Ancak VMS'nin 1 ve 2 halkalarında (Record Management Services ve CLI, sırasıyla) çalışan bileşenler NT tasarımının dışında bırakıldı. VMS'deki Ring 2 gerçekten OS güvenliği ile ilgili değil, kullanıcının CLI ortamını bir programdan diğerine korumakla ilgiliydi ve Windows NT'nin bu konsepti yoktu; CLI sıradan bir süreç olarak çalışır. VMS'nin halka 1'ine gelince, halka 1'deki RMS kodu halka 0'a oldukça sık çağrı yapmak zorundaydı ve halka geçişleri pahalıdır. Sadece ring 0 koduna gitmek ve ring 1 kodunda çok sayıda ring 0 geçişi yapmak yerine onunla yapılması çok daha verimli olduğu ortaya çıktı. (Yine de - NT'de RMS gibi bir şey yok zaten.)

Peki neden oradalar? X86 neden işletim sistemleri kullanmıyorken dört halka uyguladı? - x86'dan çok daha yeni tasarıma sahip işletim sistemlerinden bahsediyorsunuz. X86'nın "sistem programlama" özelliklerinin çoğu, NT veya gerçek Unix-ish çekirdekleri uygulanmadan çok önce tasarlandı ve işletim sistemlerinin ne kullanacağını gerçekten bilmiyorlardı. (- 80386 kadar gelmedi - biz x86 üzerinde çağrı var kadar değildi biz o olabilir . Gerçek Unix imsi veya sıfırdan bellek yönetimini yeniden ele alınmasına çekirdekler VMS benzeri uygulamak)

Modern x86 işletim sistemleri yalnızca bölümlemeyi büyük ölçüde göz ardı etmekle kalmaz (sadece temel adres 0 ve 4 GB boyutunda C, D ve S segmentlerini ayarlarlar; F ve G segmentleri bazen önemli işletim sistemi veri yapılarına işaret etmek için kullanılır) "görev durumu bölümleri" gibi şeyleri büyük ölçüde yok sayar. TSS mekanizması, iplik bağlamı geçişi için açıkça tasarlanmıştır, ancak çok fazla yan etkiye sahip olduğu ortaya çıkmaktadır, bu nedenle modern x86 işletim sistemleri bunu "elle" yapmaktadır. Örneğin x86 NT'nin donanım görevlerini değiştirdiği tek zaman, çift hata istisnası gibi bazı gerçekten istisnai durumlar içindir.

Re x64, bu kullanılmayan özelliklerin birçoğu dışarıda bırakıldı. (Kredilerine göre AMD aslında işletim sistemi çekirdek ekipleriyle konuştu ve x86'dan neye ihtiyaç duyduklarını, neye ihtiyaç duymadıklarını veya neyi istemediklerini ve neleri eklemek istediklerini sordu.) X64'teki bölümler yalnızca ne olabilir körelmiş form, görev durumu değiştirme yok vb. denir.


1
Teşekkürler! (Eğer söyleyemediyseniz, VMS çekirdeğinin etrafında biraz zaman geçirdim ...)
Jamie Hanrahan

Evet, bu izlenimi aldım ... :-) Senin gibi bir şey hakkında derin bilgiye sahip birisinin bu tür bir cevap yazmasını seviyorum, bu BT'nin tarihi ve bunu bilmek isterim. Cevabınız 20 yıl önce okuldayken beni hatırladı ve "Intel 80268 programcıları başvuru kılavuzunu" ve ardından 386 referans kılavuzunu aldım. Koruma halkaları hakkında çok şey okudum ... ama aslında onlarla hiçbir şey yapmadım. Sadece bazı basit x86 montajcı programlama ... sonra Turbo Pascal, sonra C / C ++, Java ... ve son olarak. Son 13 yıldır Net :-)
Max
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.