Çekirdek, kötü niyetli bir programın tüm fiziksel RAM'leri okumasını nasıl önler?


10

Mümkün olan her adreste belleği okumaya çalışan bir program yazarsam ve bunu "tam" bir Unix üzerinde çalıştırırsam, tüm fiziksel RAM'e erişemez. Ancak işletim sistemi bunu nasıl engelliyor?

Herhangi bir montaj kodu parçasının her şeye erişebildiği küçük CPU mimarilerine daha aşinayım. Bir programın (çekirdek) bu tür kötü niyetli işlemleri nasıl algılayabildiğini anlamıyorum.


2
MMU genellikle izin verilen alanlarınızın dışındaki belleğe erişememenize özen gösterir.
ott--

1
MMU, montaj tarafından yapılandırılır. Böylece bir montaj kodu MMU yapılandırmasını değiştirebilir ve farklı bir bellek sayfasına erişebilir, değil mi?
nowox

Bu yalnızca kodunuzu root olarak çalıştırırsanız geçerlidir.
ott--

2
Orada sayfa tabloları ve çekirdek soyutlaması hakkında okumalısınız.
Clarus

@ott: root bile MMU'yu değiştiremez (en azından Linux'ta değil). Sadece çekirdek yapar.
Basile Starynkevitch

Yanıtlar:


12

Kötü bellek erişimini engelleyen çekirdek değil, CPU. Çekirdeğin rolü yalnızca CPU'yu doğru şekilde yapılandırmaktır.

Daha doğrusu, kötü bellek erişimini engelleyen donanım bileşeni MMU'dur . Bir program bir bellek adresine eriştiğinde, MMU'nun içeriğine göre adres CPU tarafından kodu çözülür. MMU, sanal adreslerden fiziksel adreslere bir çeviri oluşturur: CPU belirli bir sanal adreste bir yük veya mağaza yaptığında, MMU içeriğine göre ilgili fiziksel adresi hesaplar. Çekirdek, MMU yapılandırmasını her programın yalnızca hakkı olan belleğe erişebilecek şekilde ayarlar. Diğer programların bellek ve donanım kayıtları, bir programın belleğinde eşlenmez: bu fiziksel adreslerin, o programın MMU yapılandırmasında karşılık gelen sanal adresi yoktur.

Farklı işlemler arasındaki bağlam geçişinde, çekirdek MMU yapılandırmasını yeni işlem için istenen çeviriyi içerecek şekilde değiştirir.

Bazı sanal adresler hiç eşlenmez, yani MMU bunları özel bir “böyle adres yok” değerine çevirir. İşlemci eşlenmemiş bir adresin kaydını silerse, bu bir tuzağa neden olur: işlemci çekirdek kodunda önceden tanımlanmış bir konuma dallar. Bazı tuzaklar meşrudur; örneğin, sanal adres takas alanında olan bir sayfaya karşılık gelebilir , bu durumda çekirdek kodu sayfa içeriğini takastan yükler, ardından bellek erişim talimatı yeniden yürütülecek şekilde orijinal programa geri döner. Diğer tuzaklar meşru değildir, bu durumda işlem varsayılan olarak programı hemen öldüren bir sinyal alır (ve programdaki sinyal işleyiciye dallanmadıysa: her durumda bellek erişim talimatı tamamlanmamıştır).


"Adres MMU'nun içeriğine göre CPU tarafından kodu çözüldü" ifadesini biraz belirtebilir misiniz ? Çalışan programda adreslerin kodunu çözen gerçek bir kod var mı? Veya bir CPU bir adrese eriştiğinde - erişim MMU'ya yapılır, bu da onu doğru şekilde çevirir / işler (belleğe veya önbelleğe erişir ve sonucu döndürür veya bir çekirdek yordamını tetikler)? Dolayısıyla mikrodenetleyici / montaj açısından MMU yeni bir parçadır. CPU doğrudan belleğe bağlı değildir, MMU'ya bağlıdır ve sanal bellek soyutlaması burada yapılır.
xealits

3
@xealits Sanal adresten fiziksel adrese çeviri, bir donanım devresi olan MMU içinde yapılır. Programda veya çekirdeğinde bunu yapacak bir kod yoktur. Çekirdek yalnızca istisnai durumlarda, program MMU girdisinin “geçersiz adres” dediği bir sanal adrese erişmeye çalıştığında çağrılır. Çekirdek ayrıca MMU'nun kullandığı RAM'daki kayıtları ve tabloları yapılandırma işini de yapar.
Gilles 'SO- kötü olmayı bırak'
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.