Giriş
İşletim Sistemler ve Kesmeler
Linux kerneli gibi işletim sistemi çekirdeklerinin en önemli sorumluluklarından birisi de şüphesiz ki donanıma hükmetmektir. Bu sayede çekirdekler, insan veya dış dünya ile yazılım arasında bağlantı kurulmasında önemli rol oynarlar. Örnek olarak bilgisayarlara takılan USB Stickler, kameralar, hopörler, fareler, klavyeler,monitorler.. Bunlara birçok örnek verilebilir. Aynı şekilde embedded yani gömülü sistemlerde amaca yönelik oluşturulan tüm donanımlarında hükmedilmesi için işletim sistemi çekirdeğinde ilgili yönetim modüllerinin bulunması gerekmektedir.
Günümüzde çoğu işletim sistemi bu işlemleri kullanıcıyı farkında bıakmadan yaparlar. Örnek olarak Linux değil mi?. Yüzbinlerce donanım driveri arka planda koşarken siz sadece kendi işinize bakarsınız. Aslında bu Linux'un bir başarısıdır. Bu olayların nasıl döndüğünü görmek içinde terminale yazılan "dmesg" komutu belki bir söz sahibi yapabilir.
İşletim sistemi bu sorumlulukları karşılamak için donanımla haberleşmek zorundadır. İşletim sisteminin koştuğu işlemci hızı ile kıyaslandığında çoğunlukla çevresel donanımların hızının çok yavaş olduğu bilinir.(Askeri veya çok ileri uygulamalar dışında)..
Bu yüzden işlemcinin üzerinde koşan işletim sisteminin, donanımdan bir istekte bulunması veya gönderdiği bir komuta yanıt beklemesi yavaş donanımlar için sıkıntı oluşturan bir durumdur. Ayrıca bu şekilde işletim sistemin real-time performansı düşer ve kullanıcıları bıktırır.
Bu gibi sorunların önüne geçmek ve donanımlardan mümkün olduğunca daha etkili bir haberleşme methodu geliştirmek için farklı mimarilere ait işlemcilerin farklı özellikleri vardır. Ama bir tanesi ve modeli aynıdır. "Interrupt Driven"..
Bu yavaşlığın önüne geçmek için herkesin düşünebileceği bir yöntem bence şudur. Yazılım donanıma isteğini kernel aracılığıyla yollasın ve eğer donanım bir cevap yollarsa ben işimi bırakıp, donanımı handle ettikten sonrageri döneyimdir. Bu sayede ben donanımdan veri beklerken, eğer donanım bana response dönmedi ise ben diğer user-space veya kernel içi işlemlerime devam edeyimdir.
Peki bu işlemci bu gereksinimi karşılamak için bize nasıl yardımcı olabilir?.
Günümüzde çoğu işlemci donanımdan gelecek sinyale göre işlemci üzerinde mevcut donanımları bilgilendirebilecek bir yapıya sahiptir ve bunun adı interrupt'tur. Eğer interrupt modu olmasa idi, işletim sistemini kodlayan geliştiriciler , işlemciye takılan donanımların bilgilerini işlemcinin registerlerinden belli bir periyotlardan okuyacaklardı. Bunun bir diğer adı "polling"'. tir. Bu method ile sisteme takılan donanımlara ait bilgiler periyodik olarak belli bir süre ile okunacak ve alındıktan sonra geri kalan işlere eri dönülecektir. Fakat periyotlar arasında eğerki bir donanım veri yollar veya hataya düşerse bu ancak bir sonraki okuma işleminde aydınlanabilecektir. Örnek olarak USB'nin çıkartılmasının geç anlaşılması gibi. Polling modu işlemcinin hızının yüksekliğine göre daha iyi çözünürlüğe sahip olabilir. Mesela daha hızlı frekansta koşan bir işletim sistemi donanımlara , daha düşük hızda koşan işlemcilere göre task periyoduna daha hızlı erişir. Fakat bu bile halen yeterli değildir. Çünkü birden çok veya 100'lerce sensör takılı olan bir PC sisteminde bu sistem sıkıntılara ve gecikmelere neden olacaktır. Görüntü donması, hopörler veya mause'un geç yanıt vermesi gibi.... Bunların herbirinin bu şekilde olması kullanılacak işletim sisteminin çöp olmasından farksızdır.
Bu yüzden işlemciler üzerinde interrupt driven özelliği vardır. Bu sayede eğerki işletim sistemi koşarken donanım bir sinyal veya işletim sistemine veri yolladığında işletim sistemi mevcut işini bırakarak, ilgili donanıma ait verileri, ilgili kernel modülünde bulunan structlara doldurur ve kullanıcıya gerekli yöntemler vasıtası ile açar.
Bu interrupt methodu ile aynı şekilde yazılımdan-donanıma - donanımdan-yazılıma bir çevrim söz konusudur. Bu sayede ilgili donanıma istek yollanır. Donanım cevap verene kadar işletim sistemi geri kalan işlemlerini yapar ve donanımdan ilgili sinyal geldiğinde, linux kerneli ilgili interrupt handlerina dallanarak verileri toplar. Bu sayede işlemci ve işletim sistemi yorulmaz ve gözle görülür hızda bir performans sağlanır. Bu kesmelere ise örnek olarak bir klavye de tuşa basılması veya mause tıklaması verilebilir.
Yani siz bir formu doldurduğunuz zaman işletim sistemi klavyeden veri beklerken aynı anda firefoxu kullanarak youtube girebilirsiniz. İşletim sistemi çekirdeği sürekli bir şekilde sizi beklemez, donanımı beklemez. Bu sayede diğer uygulamalar beklenmez ve real-time gereksinimler karşılanır. Yani uygulamalar arasında gecikme olmadığından her 100 ms de bir ekrana veri basılması gerekiyorsa bu işlem her zaman 100 ms civarlarında ha eksik ha fazla gerçekleşir. Fakat bu süre genellikle 120 ms'yi geçmez.
Son yıllarda interrupt modundan daha gelişmiş bir interrupt mekanizması vardırki bu da DMA modudur. Günümüzdeki çoğu işlemcide bulunan bu özellik sayesinde işlemci artık interrupt requestlerine ait fonksiyonlarla da meşgul olmaz. İşlemci üzerinde bulunan bir modül donanımlar ve memory arasında bir köprü oluşturarak ilgili donanım verisini, interrupt sinyali geldiğinde ilgili işletim sistemindeki memory yerine yazar ve eğer gerekli ise işlemciyi bilgilendirir. Bu bilgilendirme sonucunda ise bir interrupt request oluşur ve işlemci mevcut işini bırakarak bu veriyi alır. Almayada bilir. DMA'nın yazdığı adresi okuayrakta donanıma ait bilgileri alır.
Aynı şekilde eğerki işletim sistemi donanımla iletişim kuracak ise, kernel ilgili datayı donanıma ait memory adresine yazar ve işlemcinin DMA modülü bu data oluştuğunda bu veriyi işlemciyi yormadan donanıma yollar. Bu sayede real time yakın bir haberleşme sağlanır.