Minix 3

Minix 3, Unix benzeri bir küçük bir işletim sistemidir. BSD-3-Lisansı altında yayınlanır ve önceki sürümler olan Minix 1 ve 2'nin devamı niteliğinde bir projedir.

Projenin ana hedefi, sistemin herhangi bir kullanıcı müdahalesi olmadan anında tespit edilip onarılarak sistemin arızaya dayanıklı hale getirilmesidir. Sistemin temel kullanımlarının gömülü sistemler ve eğitim olması öngörülmektedir.

, Minix 3, IA-32 ve ARM mimarili işlemcileri destekler. Bochs, VMware Workstation, Microsoft Virtual PC, Oracle VirtualBox ve QEMU gibi emülatörler veya sanal makineler üzerinde de çalışabilir. PowerPC mimarisi için bir port geliştirme aşamasındadır.

Minix 3'ün, Skylake ve Kaby Lake işlemcilerle birlikte kullanılan ME 11'in piyasaya sürülmesinden başlayarak Intel'in Platform Denetleyici Merkezinde bulunan Intel Management Engine (ME) işletim sistemine ilham verdiğine inanılıyor.

Intel ME'de kullanılması nedeniyle Minix'in Microsoft Windows, Linux veya macOS'tan daha fazla kurulumla x86 / AMD64 işlemcilerde en yaygın kullanılan işletim sistemi olabileceği tartışıldı.

Bir sürücünün (Minix'in yaratıcısı Tanenbaum'a göre normal bir programa göre yaklaşık 3-7 kat daha fazla hataya sahip olan) tüm sistemi çökertebileceği yekpare çekirdek tabanlı sistemlerin doğasını düşünerek, Minix 3, "güvenilir, kendi kendini iyileştiren, çok sunuculu Unix klonu" olan bir işletim sistemi oluşturmayı amaçlar.

Bunu başarmak için, dosya sunucusu, işlem sunucusu ve her bir aygıt sürücüsü ayrı kullanıcı modu işlemleri olarak çalışırken, çekirdekte çalışan kod minimum düzeyde olmalıdır. Her sürücü, reenkarnasyon sunucusu adı verilen sistemin bir bölümü tarafından dikkatle izlenir. Bir sürücü bu sunucudan gelen pinglere yanıt veremezse kapatılır ve sürücünün yeni bir kopyası ile değiştirilir.

Minix 3, 24 Ekim 2005'te Andrew Tanenbaum tarafından Association for Computing Machinery (ACM) Sempozyumu İşletim Sistemleri İlkeleri konferansının zirvesindeki açılış konuşması sırasında kamuoyuna duyuruldu. Hala Tanenbaum ve Woodhull'un ders kitabının yeni baskısı için bir örnek teşkil etse de, "kaynak sınırlı ve gömülü bilgisayarlarda ve yüksek güvenilirlik gerektiren uygulamalarda ciddi bir sistem olarak kullanılabilir" olacak şekilde kapsamlı bir şekilde yeniden tasarlandı.

Başlangıçta, Minix'in 2000'den beri lisanslandığı aynı BSD-3-Clause lisansı altında yayınlandı. 2005 sonlarında telif hakkı sahibi değiştirildi ve dördüncü bir madde eklendi.

Linux ve FreeBSD gibi monolitik işletim sistemleri ve Windows gibi hibrit işletim sistemleri milyonlarca satırlık çekirdek koduna sahiptir. Buna karşılık, Minix 3'te yaklaşık 6.000 satır yürütülebilir çekirdek kodu vardır , bu kodda sorunların bulunmasını kolaylaştırabilir.

Monolitik çekirdeklerde, aygıt sürücüleri çekirdekte bulunur. Böylece yeni bir çevre birimi kurulduğunda çekirdeğe bilinmeyen, güvenilmeyen kod eklenir. Bir sürücüdeki hatalı bir kod satırı sistemi çökertebilir.

Bunun yerine, Minix 3'te her aygıt sürücüsü ayrı bir kullanıcı modu işlemidir. Sürücüler ayrıcalıklı yönergeleri yürütemez, sayfa tablolarını değiştiremez, isteğe bağlı giriş/çıkış (G/Ç) gerçekleştiremez veya mutlak belleğe yazamaz. Bu hizmetler için çekirdek çağrıları yapmaları gerekir ve çekirdek her yetki çağrısını kontrol eder.

Minix 3'te, bir kullanıcı örneğin dosya sisteminden veri beklediğinde, kimin ve hangi adreslerde erişime sahip olduğunu söyleyen bir tanımlayıcı oluşturur. Daha sonra, bu tanımlayıcıya bir dizini, onu bir sürücüye iletebilecek olan dosya sistemine iletir. Dosya sistemi veya sürücü daha sonra çekirdeğe tanımlayıcı aracılığıyla yazmasını ister, bu da arabellek dışındaki adreslere yazmalarını imkansız hale getirir.

Bir sürücü içindeki hatalı bir işaretçinin başvurusunun kaldırılması, sürücü sürecini çökertecektir, ancak bir bütün olarak sistem üzerinde hiçbir etkisi olmayacaktır. Reenkarnasyon sunucusu, çöken sürücüyü otomatik olarak yeniden başlatacaktır. Kullanıcılar bazı sürücüler için (örn. disk ve ağ) kurtarmayı fark etmeyeceklerdir ancak diğerleri için (örn. ses ve yazıcı) fark edebilirler. Monolitik çekirdeklerde, bir sürücüdeki hatalı bir işaretçinin başvurusunun kaldırılması normalde sistem çökmesine neden olur.

Bir sürücü sonsuz bir döngüye girerse, zamanlayıcı boşta kalana kadar önceliğini kademeli olarak düşürür. Sonunda reenkarnasyon sunucusu durum isteklerine yanıt vermediğini görecek, bu nedenle döngü sürücüsünü öldürecek ve yeniden başlatacaktır. Yekpare bir çekirdekte, bir döngü sürücüsü sistemi kilitleyebilir.

Minix 3, belirli arabellek taşmalarını ve arabellek yönetimi sorunlarını ortadan kaldıran dahili iletişim için sabit uzunlukta mesajlar kullanır. Ayrıca, birçok istismar, saldırgan tarafından kontrol edilen belleğe, genellikle taşma arabelleğine işaret eden üzerine yazılmış bir yığın dönüş adresi kullanarak programı bir işlev çağrısından geri dönmesi için kandırmak üzere bir arabelleği taşarak çalışır. Minix 3'te, talimat ve veri alanı bölündüğü ve yürütülebilir alan koruması olarak adlandırılan yalnızca (salt okunur) talimat alanındaki kod yürütülebildiği için bu saldırı hafifletilir. Ancak, yasal olarak yürütülebilir belleğin kötü niyetli bir şekilde çalıştırılmasına dayanan saldırılar ( libc'ye dönüş, geri dönüş yönelimli programlama ) bu hafifletme ile engellenmez.

Aygıt sürücüleri, çekirdek çağrıları yaparak çekirdek hizmetlerini (kullanıcıların adres alanlarına veri kopyalamak gibi) alır. Minix 3 çekirdeği, her sürücü için hangi çağrıları yapmaya yetkili olduğunu belirten bir bit haritasına sahiptir. Monolitik çekirdeklerde, her sürücü yetkili olsun ya da olmasın her çekirdek işlevini çağırabilir.

Çekirdek ayrıca her sürücünün hangi G/Ç bağlantı noktalarına erişebileceğini söyleyen bir tablo tutar. Bu nedenle, bir sürücü yalnızca kendi G/Ç bağlantı noktalarına dokunabilir. Monolitik çekirdeklerde, hatalı bir sürücü başka bir aygıta ait G/Ç bağlantı noktalarına erişebilir.

Her sürücü ve sunucunun diğer tüm sürücü ve sunucularla iletişim kurması gerekmez. Buna göre, işlem başına bir bit haritası, her işlemin hangi hedeflere gönderim yapabileceğini belirler.

Reenkarnasyon sunucusu adı verilen özel bir işlem, her aygıt sürücüsüne düzenli aralıklarla ping gönderir. Sürücü ölürse veya pinglere doğru yanıt veremezse, reenkarnasyon sunucusu otomatik olarak onu yeni bir kopyayla değiştirir. Çalışmayan sürücülerin algılanması ve değiştirilmesi kullanıcının herhangi bir işlem yapmasına gerek kalmadan otomatik olarak yapılır. Bu özellik şu anda disk sürücüleri için çalışmamaktadır, ancak bir sonraki sürümde sistem, rastgele erişim belleğinde (RAM) gölgelenecek olan disk sürücülerini bile kurtarabilecektir. Sürücü kurtarma, çalışan işlemleri etkilemez.

Bir kesme meydana geldiğinde, düşük seviyede uygun sürücüye gönderilen bir bildirime dönüştürülür. Sürücü bir mesaj bekliyorsa, kesmeyi hemen alır; aksi takdirde, bir sonraki sefer bir mesaj almak için RECEIVE bildirim alır. Bu şema, iç içe kesintileri ortadan kaldırır ve sürücü programlamayı kolaylaştırır.

Görülebileceği gibi, en alt seviyede, yaklaşık 4.000 satırlık koddan (çoğunlukla C'de ve az miktarda da Assembly dilinde) oluşan mikro çekirdek bulunur. Kesintileri, zamanlamayı ve ileti geçişini yönetir. Ayrıca, yetkili sunucuların ve sürücülerin yapabileceği yaklaşık 30 çekirdek çağrısından oluşan bir uygulama programlama arabirimini (API) destekler. Kullanıcı programları bu çağrıları yapamaz. Bunun yerine, sunuculara mesaj gönderen POSIX sistem çağrıları yapabilirler. Çekirdek çağrıları, kesmeleri ayarlamak ve adres alanları arasında veri kopyalamak gibi işlevleri yerine getirir.

Bir sonraki seviyede, her biri ayrı bir kullanıcı alanı işlemi olarak çalışan aygıt sürücüleri vardır. Her biri, disk veya yazıcı gibi bazı G/Ç aygıtlarını kontrol eder. Sürücülerin G/Ç bağlantı noktası alanına erişimi yoktur ve doğrudan G/Ç yönergeleri veremez. Bunun yerine, yazılacak G/Ç bağlantı noktalarının ve yazılacak değerlerin bir listesini veren çekirdek çağrıları yapmaları gerekir. Bunu yaparken küçük bir miktar ek yük olsa da (tipik olarak 500 ns), bu şema çekirdeğin yetkilendirmeyi kontrol etmesini mümkün kılar, böylece örneğin ses sürücüsü diske yazamaz.

Bir sonraki seviyede sunucular var. Bu, neredeyse tüm işletim sistemi işlevlerinin bulunduğu yerdir. Kullanıcı işlemleri, örneğin dosyaları açmak, kapatmak, okumak ve yazmak için dosya sunucusuna mesajlar göndererek dosya hizmeti alır. Buna karşılık, dosya sunucusu, diski kontrol eden disk sürücüsüne mesajlar göndererek disk G/Ç'sini gerçekleştirir.

Anahtar sunuculardan biri reenkarnasyon sunucusudur. Görevi, sağlıklarını periyodik olarak kontrol etmek için diğer tüm sunucuları ve sürücüleri yoklamaktır. Bir bileşen doğru şekilde yanıt vermezse veya çıkarsa veya sonsuz bir döngüye girerse, reenkarnasyon sunucusu (sürücülerin ve sunucuların ana işlemidir) hatalı bileşeni öldürür ve onu yeni bir kopyayla değiştirir. Bu sayede çalışan programlara müdahale etmeden sistem otomatik olarak kendi kendini onarır hale getirilir.

Şu anda reenkarnasyon sunucusu, işlem sunucusu ve mikro çekirdek, güvenilir bilgi işlem tabanının parçalarıdır. Bunlardan herhangi biri başarısız olursa, sistem çöker. Bununla birlikte, Linux ve Windows sistemlerinde olduğu gibi 3-5 milyon satır koddan güvenilir bilgi işlem tabanını yaklaşık 20.000 satıra düşürmek, sistem güvenilirliğini büyük ölçüde artırır.

1987'de piyasaya sürülen Minix 1.0, 12.000 satır C ve biraz x86 derleme diliydi. Minix 1.0'ın çekirdeğinin, bellek yöneticisinin ve dosya sisteminin kaynak kodu kitapta basılıdır. Tanenbaum, Minix'i orijinal olarak o sırada mevcut olan IBM PC ve IBM PC/AT mikrobilgisayarlarıyla uyumluluk için geliştirdi.

1991'de piyasaya sürülen Minix 1.5, MicroChannel IBM PS/2 sistemleri için destek içeriyordu ve ayrıca Atari ST, Commodore Amiga, Apple Macintosh ve Sun Microsystems SPARCstation bilgisayar platformlarını destekleyen Motorola 68000 ve SPARC mimarilerine taşındı. SunOS altında bir kullanıcı işlemi olarak çalışan bir Minix sürümü de mevcuttu.

1997'de piyasaya sürülen Minix 2.0, yalnızca x86 ve Solaris tarafından barındırılan SPARC mimarileri için mevcuttu. Minix-vmd, iki Vrije Universiteit araştırmacısı tarafından oluşturuldu ve X Pencere Sistemi için sanal bellek ve destek eklendi.

Minix 2 sürümünden bu yana çekirdeğin yapısında da birçok iyileştirme yapılarak sistem daha güvenilir hale getirildi. Minix sürüm 3.1.5, 5 Kasım 2009'da yayınlandı. X11, Emacs, vi, cc, GCC, Perl, Python, Almquist kabuğu, Bash, Z kabuğu, FTP istemcisi, SSH istemcisi, Telnet istemcisi, Pine ve 400'ün üzerinde diğer yaygın Unix yardımcı programlarını içerir. X11'in eklenmesiyle bu sürüm salt metin sisteminden geçişi işaret ediyor. Gelecekte geliştirilecek olan bu versiyonun bir başka özelliği de, sistemin aygıt sürücüsü çökmelerine dayanabilmesi ve çoğu durumda çalışan işlemleri etkilemeden bunları otomatik olarak değiştirebilmesidir. Bu sayede Minix kendi kendini onarır ve yüksek güvenilirlik gerektiren uygulamalarda kullanılabilir.

Minix 3.2.0, Şubat 2012'de yayınlandı. Bu sürüm, Clang derleyici, deneysel simetrik çoklu işlem desteği, procfs ve ext2fs dosya sistemi desteği ve GNU Hata Ayıklayıcı (GDB) dahil olmak üzere birçok yeni özelliğe sahiptir. Önyükleyici, libc ve çeşitli yardımcı programlar ve diğer kitaplıklar dahil olmak üzere NetBSD'nin çeşitli bölümleri de yayına entegre edilmiştir.

Minix 3.3.0, Eylül 2014'te piyasaya sürüldü. Bu sürüm, x86'ya ek olarak ARM mimarisini destekleyen ilk sürümdür. Ayrıca, kutudan çıkar çıkmaz çalışan binlerce NetBSD paketiyle bir NetBSD kullanıcı alanını da destekler.