İşletim sistemlerinin ve üzerinde çalıştıkları donanımın nasıl çalıştığı ve birbirleriyle nasıl etkileşime girdiği hakkında daha fazla şey öğrenirken, tuhaflıklar ya da “kaynakların” yetersiz kullanımı gibi görünen şeylere şaşırabilirsiniz. Neden? Bugünün Süper Kullanıcı Soru-Cevap yayını, meraklı bir okuyucunun sorusunun cevabını içeriyor.
Bugünün Soru-Cevap oturumu bize, topluluk odaklı bir Soru-Cevap web siteleri grubu olan Stack Exchange'in bir alt bölümü olan SuperUser'ın izniyle geliyor.
Fotoğrafın izniyle Lemsipmatt (Flickr) .
Soru
Süper Kullanıcı okuyucu AdHominem, x86 CPU'ların neden dört halkadan yalnızca ikisini kullandığını bilmek istiyor:
Linux ve Windows tabanlı x86 sistemleri yalnızca Yüzük 0 çekirdek modu için ve Yüzük 3 kullanıcı modu için. İşlemciler, hepsi zaten sadece ikisini kullanıyorlarsa neden dört farklı halkayı ayırıyorlar? Bu AMD64 mimarisiyle değişti mi?
X86 CPU'lar neden dört halkadan yalnızca ikisini kullanıyor?
Cevap
SuperUser katılımcısı Jamie Hanrahan'ın cevabı bizim için:
İki temel neden var.
Birincisi, x86 CPU'ları dört bellek koruma halkası sunsa da, bu şekilde sunulan korumanın ayrıntı düzeyi yalnızca segment başına seviyededir. Yani, her segment, yazma devre dışı bırakma gibi diğer korumaların yanı sıra belirli bir halkaya (ayrıcalık düzeyi) ayarlanabilir. Ancak çok fazla segment tanımlayıcısı mevcut değildir. Çoğu işletim sistemi, tek tek sayfalar için olduğu gibi, çok daha ince bir bellek koruması granülerliğine sahip olmak ister.
Bu nedenle, sayfa tablosu tabanlı korumayı girin. Modern x86 işletim sistemlerinin tümü olmasa da çoğu, bölümleme mekanizmasını (her halükarda yapabildikleri kadarıyla) az ya da çok görmezden gelir ve sayfa tablosu girişlerindeki düşük dereceli bitlerden elde edilen korumaya güvenir. Bunlardan biri "ayrıcalıklı" bit olarak adlandırılır. Bu bit, işlemcinin sayfaya erişmek için "ayrıcalıklı" düzeylerden birinde olması gerekip gerekmediğini kontrol eder. "Ayrıcalıklı" seviyeler PL 0, 1 ve 2 . Ancak bu yalnızca bir bittir, bu nedenle sayfa sayfa koruma düzeyinde, bellek koruması söz konusu olduğunda kullanılabilen “modların” sayısı yalnızca ikidir: Bir sayfaya ayrıcalıklı olmayan moddan erişilebilir veya erişilemez. Dolayısıyla, sadece iki yüzük. Her sayfa için dört olası halkaya sahip olmak için, dört olası halka numarasından birini kodlamak için her sayfa tablosu girişinde iki koruma bitine sahip olmaları gerekir (tıpkı segment tanımlayıcılarında olduğu gibi). Ancak, yapmazlar.
Diğer neden, işletim sistemi taşınabilirliği arzusudur. Bu sadece x86 ile ilgili değil; Unix bize bir işletim sisteminin birden çok işlemci mimarisine göreceli olarak taşınabilir olabileceğini ve bunun iyi bir şey olduğunu öğretti. Ve bazı işlemciler yalnızca iki halkayı destekler. Mimaride birden fazla halkaya bağlı kalmayarak, işletim sistemi uygulayıcıları işletim sistemlerini daha taşınabilir hale getirdi.
Windows NT geliştirmeye özgü üçüncü bir neden daha var. NT’nin tasarımcıları (Microsoft’un DEC Western Region Labs’tan kiraladığı David Cutler ve ekibi) daha önce VMS konusunda kapsamlı deneyime sahipti; Aslında, Cutler ve diğerleri VMS’nin orijinal tasarımcıları arasındaydı. Ve VMS'nin tasarlandığı VAX işlemcinin dört halkası vardır (VMS, dört halka kullanır).
Ancak VMS’lerde çalışan bileşenler Yüzük 1 ve 2 (Sırasıyla Kayıt Yönetim Hizmetleri ve CLI) NT tasarımının dışında bırakıldı. Yüzük 2 VMS'de aslında işletim sistemi güvenliği ile ilgili değil, daha çok kullanıcının CLI ortamını bir programdan diğerine korumakla ilgiliydi ve Windows bu konsepte sahip değildi; CLI sıradan bir süreç olarak çalışır. VMS’lere gelince Yüzük 1 , içindeki RMS kodu Yüzük 1 aramak zorunda kaldı Yüzük 0 oldukça sıktır ve halka geçişleri pahalıdır. Sadece gitmek çok daha verimli oldu Yüzük 0 ve çok şey yapmaktansa onunla yapılmalı Yüzük 0 içindeki geçişler Yüzük 1 kod (yine, NT zaten RMS gibi bir şeye sahip değildir).
İşletim sistemleri bunları kullanmazken x86'nın neden dört halka uyguladığına gelince, 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 çekirdekler üzerine uygulanmadan çok önce tasarlanmıştı ve işletim sisteminin ne kullanacağını gerçekten bilmiyorlardı. Gerçek Unix-ish veya VMS benzeri çekirdekler uygulayabileceğimiz x86'da sayfalama yapana kadar değildi.
Modern x86 işletim sistemleri yalnızca bölümlemeyi büyük ölçüde yok saymakla kalmaz (yalnızca temel adresi 0 ve 4 GB boyutuyla C, D ve S bölümlerini ayarlarlar; F ve G bölümleri bazen temel işletim sistemi veri yapılarına işaret etmek için kullanılır. ), "görev durumu bölümleri" gibi şeyleri de büyük ölçüde göz ardı ederler. TSS mekanizması açıkça iş parçacığı bağlamını değiştirmek için tasarlandı, ancak çok fazla yan etkiye sahip olduğu ortaya çıktı, bu nedenle modern x86 işletim sistemleri bunu "elle" yapıyor. X86 NT'nin donanım görevlerini değiştirdiği tek zaman, çift hata istisnası gibi bazı gerçekten istisnai koşullar içindir.
X64 mimarisiyle ilgili olarak, bu kullanılmayan özelliklerin çoğu dışarıda bırakıldı. AMD aslında işletim sistemi çekirdek ekipleriyle konuştu ve x86'dan neye ihtiyaç duyduklarını, neye ihtiyaç duymadıklarını veya istemediklerini ve neyi eklemek istediklerini sordu. X64'teki segmentler yalnızca artık olarak adlandırılabilecek şekilde bulunur, görev durumu değiştirme yoktur vb. Ve işletim sistemleri yalnızca iki halka kullanmaya devam eder.
Açıklamaya eklemek istediğiniz bir şey var mı? Yorumlarda ses çıkarın. Diğer teknoloji meraklısı Stack Exchange kullanıcılarından daha fazla yanıt okumak ister misiniz? Tartışma dizisinin tamamına buradan göz atın .