Interrupt handler veya interrupt service routine(ISR) olarak adlandırılan fonksiyonlar, gerçekleşen interrupt eventlerinin işlemci üzerinde işletilmesi için gerekli olan fonksiyon prototiplerdir.

Genelde işlemci üzerinde bir interrupt olduğunda işlemci, Program Counter Registerini(PCR) kendi içinde ilgili interrupta atanmış fonksiyon prototipine set ederek o fonksiyonu execute eder yani işler, yada dallanır. ne demekte özgürsünüz. İşlemci bu dallanmayı yapabilmek için kendi içinde context switching yapar. Bu context switch denilen konu çok derin bir konu olmakla birlikte şöyle basit bir şekilde anlatabileceğimi düşünüyorum.

Genel olarak işletim sistemleri birden fazla işlemi aynı anda yapabilmek üzere özelliştirilen bir scheduler'e sahiptir ve bu linux'ta farklı tiplerdedir. Bu scheduler sayesinde binlerce program aynı anda çalışıyormuş gibi gösterilir. Aksine bu bir göz yanılmasıdır. İşlemci çok hızlı bir şekilde processlere ait contextleri değiştirerek multitasking işlem yapar. Örnek olarak scheduleri 5 ms'de bir değişecek şekilde bir sistem düşünün. işletim sisteminin her 5 ms'de bir farklı bir programın farklı bir kodunu execute ettiğini düşünün. Aklınızda daha kolay canlanacaktır.

Örnek olarak 5ms'de youtube üzerinden video izlemek için gerekli işlemler yaparken, diğer 5ms'de visual stduio'da kod yazabilmek için işlemcinin gerekli işlemleri yaptığını düşünün. Bu programlara ait olan tüm fonksiyonlara, memory'e, stacklere, program counterların toplamına context diyoruz. İşlemci 5ms'de bir farklı bir process'e ait contextleri çalıştırdığı için multitasking çalıştığını hissederiz. Bu mükemmel bir şey değil mi?. Mevcut durumda işlemcinin çekirdeklerininde kendi içinde context switching yapabilme özellikleri olduğu için arka planda binlerce uygulama ve interrupt requestleri hızlı bir şekilde işlenirler ve biz bunu hiçbir zaman hissedemeyiz lakin arkada ne olduğu konusunda en azından bir fikrimiz olmuş olur.

Linux işletim çekirdeği normal durumlarda kendi işlemlerini yapar iken eğerki işlemci tarafında bir interrupt oluşursa işlemci tarafından kernel invoke edilerek interrupt handler fonksiyonu execute edilir ve bu tamamen farklı bir yerde execute edilir.Bu kısım interrupt contexttir ve process contextten bağımsızdır.

Normal durumda her interrupt requeste ait bir default handler bulunmaktadır. Örnek olarak system timer callback veya usb plug callback gibi kesme fonksiyonlarının kendine ait bir default handler fonksiyonu bulunmaktadır. Yazılımcı isterse bu interrupt fonksiyonunu dilediği gibi değiştirebilir. Lakin fonksiyon prototipine ait parametreleri değiştiremez. Çünkü her fonksiyona ait interrupt requestleri aynı parametreyi almaz. Örnek olarak gerçek zaman saati kesmesi olan RTC modülü parametre olarak gerçek saat değerini yollarken, klavye ise basılan tuşa ait veri structunu geri yollayabilir. Bunlar tamamen farklı olmak zorundadır.

Interrupt handler, donanıma ait linux driveri geliştirebilmek için ilgili driver modülünün bir parçası olmak durumundadır. Bu fonksiyonlar kernel ile birlikte execute edilirler. Fakat çalıştığı context tamamen farklıdır. Fakat driver kodunun yönetimi tamamen linux kerneli tarafından yapılmaktadır.

Linux'ta donanımı ve işletim sistemini yöneten kodlar genelde C dili ile yazılmışlardır. Linux kerneli derlendiği zaman birer modül olarak sisteme yüklenirler. Fakat bütün driverlara ait modüller sisteme yüklenmez sadece gerekli olanlar inbuilt veya module olarak işaretlenerek sisteme yüklenirler. Aynı şekilde bu modüller kernel yüklenmiş veya işletim sistemi açılmış olsa bile sisteme yüklenebilirler. Bunlara ise loadable kernel modülü denmektedir.

Interrupt handler fonskiyonlarının diğer linux fonksiyonlarından tek farkı ise tamamiyle farklı bir context üzerinde çalıştırılmalarıdır. Bu yüzden hızlıdırlar.!. Fakat bu hızlılığı veya performansı interrupt handler içine gereksiz fonksiyon yerleştirmeden de hızlandırabilirsiniz. Interrupt fonksiyonlarının bir diğer farkı ise bu fonksiyonlar execute edilirken hiçbir şekilde bloklanamazlar bu nedenle eğer interrupt callback fonksiyonu içinde bir hata oluşur ise kernel çöker. Bu yüzden işlemciye ait watchdog timer modülü devreye girer ve ya işlemci halt moduna alınır yada işlemci resetlenerek kernel tekrardan yüklenir. Çünkü

linux scheduleri interrupt fonksiyonunu bölemediği için processlere ait context switch yapamaz ve işletim sistemi tamamiyle çöker. Şansınız var ise işlemcinin watchdog timer kesmesine ait fonksiyonlarda geniş bir exception handler kullanarak işletim sistemini geri getirebilirsiniz. Lakinbu tamamen zorlu bir challengedir.

results matching ""

    No results matching ""