MMU'suz bir işlemci için çok görevli bir işletim sistemi yazma


9

Bazı ARM işlemcileri için hobi işletim sistemi yazmayı düşünüyorum. ARM MPU ile birçok popüler tek kartlı bilgisayar var, bu yüzden bunlardan birini satın almak istedim (daha açık belgelere sahip bir tane seçerek). Gerçekten yeterli belleğe sahip kartlarda bile Bellek Yönetim Birimi ile MPU bulunmadığını öğrendiğimde şaşırdım.

Her zaman i386 + işlemcilerle çalıştığım ve başka hiçbir şey (bazı Microchip PIC'ler hariç) ile çalıştığım için, şimdi kafam karıştı ve yazılı işletim sistemlerine kıyasla işlevselliği sınırlı olmayan çalışan bir işletim sistemi yazıp yazamayacağından emin değilim MMU'lu MPU'lar için.

MMU'yu "değiştirmek" veya "taklit etmek" için birkaç çözüm düşünebilirim ve birkaç sorum var:

  • 16 ve 32 bit modlarındaki Intel işlemcilerde, farklı görevler tarafından farklı bellek bloklarını kullanmak için segmentleri ve segment seçicileri kullanmanın bir yolu vardır. Bu, x86 açıkken bir görev anahtarı yaparken segment kayıtlarının içeriğini değiştirerek bellek alanını değiştirebileceğim anlamına gelir. ARM mimarisinde kullanılabilecek bellek segmentasyonu için genel kavramlar var mı?
  • Yürütülebilir dosya yerine bağlantılı bir nesne dosyası yükleyerek, disk belleği yapıları kullanarak bellek eşleme gibi görevleri bellek parçaları üzerinde noktalamak için yer değiştirme (fix-up) veya bağımsız kodu konumlandırabilirsiniz. Bu yeterince etkili olur mu?
  • ARM işlemcilerindeki Bellek Koruma Birimleri hakkında da bir şeyler okudum. Bunlar yardımcı olabilir mi?

MMU'suz sistemlerde görevleri yönetmenin "olağan" yolları var mı?

Yanıtlar:


16

MMU gerektirmeyen bir işletim sistemi tasarlamak aslında o kadar da zor değil. Olmadan yapmanız gereken birkaç kolaylık vardır, ancak aşılmaz bir şey yoktur.

  • Farklı görevlerin farklı adreslere yüklenmesi gerekeceğinden, tüm kodlarınız (çekirdek, standart kütüphane ve temel çalışma ortamı ortamınızın bir parçası olan diğer kodlar hariç) konumdan bağımsız olarak derlenmelidir. Bu, bir kayıtta depolanan yığın erişimi için göreli sıçramalar ve temel adres anlamına gelir. X86-32'nin dört genel kaydına alışkınsanız, bir kaydı temel adres olarak harcamanın maliyeti yüksek görünebilir, ancak çoğu modern mimarinin daha fazlası vardır ve 8088'de bunun için tam olarak segment kayıtları vardır.
  • Unix benzeri bir mimari revize edilmelidir, çünkü uygulayamazsınız fork. Sorun değil, çoğu işletim sisteminde yoktur fork. (Sahip olabilirsiniz vfork.)
  • Karşılık gelen belleği ayırmadan büyük alanların yerini değiştiremezsiniz. Bu, bir seferde bir sayfa daha ayırarak yığın veya yığının anında büyümemesi anlamına gelir.

Bir MPU'nuz varsa, görevleriniz çok görevli işletim sistemlerinde her zamanki gibi birbirinden ayrılabilir. MPU olmadan, bellek ayırma işlemi yalnızca görevlerin rasgele kod yürütmesine izin verirseniz işbirliğine dayalı olabilir. MPU'suz bellek ayırma elde etmenin bir yolu, görevleri sanal makinede yalnızca doğrulanmış kod kullanacak şekilde kısıtlamak ve VM motorunun bir parçası olarak yazılımda bellek koruması uygulamaktır.

uClinux , MMU'suz işlemciler (ARM Cortex-M dahil) üzerinde çalışan Linux çekirdeğine dayanan bir projedir. Onun çoklu görev kısıtlamalar yukarıda özetlenen temel olarak şeylerdir.

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.