Çekirdek için donanım ile yazılım arasında bir arayüz diyoruz. Genelde donanım ile alakalı kısımları okurken, donanım hakkında bir fikir sahibi olmanız gerekiyor ki çekirdeğin nereye varmaya çalıştığını anlayabilesiniz. Bunun için de donanım speklerine ihtiyaç duyarsınız. Ama bazen bu spekler de yetersiz kalır, çünkü spekler size o donanımı nasıl kullanabileceğinizi anlatırlar. Fakat sizin ihtiyacınız olan, o an baktığınız sistemde o donanımın ne şekilde kullanılmış olduğu bilgisidir.

ISA‘da edge-triggered kesmeler, PCI‘da level-triggered kesmeler kullanıldığını ve bu yüzden PCI bus’larda kesme paylaşımı yapılabileceği ancak ISA’da kesme paylaşımı yapılamayacağını duymuş ama nedenini merak ediyorsanız, hatta ISA’da aynı zamanda kesme paylaşımı yapılabileceğini duymuş, hayda hani yapılamıyordu diyorsanız, ya da edge/level triggered ne ola ki diyorsanız okumaya devam edebilirsiniz.


Dijital sistemlerde kesmeler sinyalin farklı zamanlarına bakılarak tetiklenebilir. İki çeşit tetikleme mekanizması bulunmaktadır: edge (kenar) ya da level (seviye) tetiklemeli. Kenar tetiklemeli kesmeler, sinyalin 1′den 0′a ya da 0′dan 1′e geçtiği anların tespiti ile; seviye tetiklemeli kesmeler, sinyal’in 0 ve ya 1 seviyesinde bulunduğu anlara bakılarak yapılır.

Kenar (edge) ve seviye (level) tetiklemeli kesmeler ve sorunları üzerine konuşacağımız için Intel’in 8259 entegresi bu konu için ideal. 8259′un datasheet‘ine buradan ulaşabilirsiniz.

Kesme Süreci

x86 mimarisindeki bir işlemcide “genel” amaçlı kesmeler için istenildiğinde maskelenebilen INTR pin’i kullanılıyor. Pin dışarıdaki bir kesme kontrolörünün çıkışına bağlanıyor. Kontrolör tek bir 8259 entegresi olduğu durumda 8 farklı cihaz da bu kontrolörün girişine bağlanabiliyor.

8259 kontrolörü içerisinde kesme isteklerini işleyen iki odacık olduğunu düşünebiliriz. İlk oda kabul odası (IRR), ikinci oda ise servis odası (ISR). Her hangi bir girdiden kesme geldiği anda IRR odasında beklemeye alınıyor ve özel bir süreç işlemeye başlıyor. Bu süreç şu şekilde işliyor:

1. Kontrolör girişlerinden bir pin (IR7-0) yüksek değere çekilir. Kesme geldi.
2. 8259 bunu farkeder ve işlemci’ye INT gönderir.
3. İşlemci, INTA pin’i ile kontorolöre ack sinyali gönderir.
4. IRR’deki yüksek öncelikli bit (0-7) ISR’ye alınır ve IRR’deki bit temizlenir.
5. İşlemci ilk INTA’nın ardından ikinci bir INTA gönderir. Bu sefer 8259, 8-bitlik veri hattına kesme vektör bilgisini yerleştirir. İşlemci bu vector bilgisini IDT (Interrupt Descriptor Table) ile birlikte kullanarak o kesme için işaret edilen adresteki kesme işleyicisini (interrupt handler) çalıştırır.
6. IRR, ilk INTA sonunda resetlenmişti, ikinci INTA sonunda da ISR resetlenmeli. Bu, kesme’nin görevini yerine getirdiğinin bir işareti: End-Of-Interrupt (EOI). 8259 Auto EOI modunda ise bu biti ikinci INTA sonrası kendisi temizliyor, eğer değilse kesme işleyicisinin ilgili ISR bit’i için 8259′a EOI komutu göndermesi gerekiyor.

Kenar Tetiklemeli Kesmeler (Edge-Triggered Interrupts)

ISA veriyolu kenar tetiklemeli kesmeler kullanılmak üzere tasarlanmış. Anakart üzerinde bir yerlerde 8259 kesme kontrolörü kenar tetiklemeye duyarlı olarak programlanmış şekilde bekliyor. Kontrolör herhangi bir kesme girişinden sinyal’in düşük seviye’den yüksek seviyeye geçtiğini algıladığı anda işlemci’ye kesme gönderecek. Buna göre şu şekilde çalışan bir ISA cihazı düşünebiliriz. Cihaz normalde kesme hattını düşük seviyede, kesme göndereceği zaman da kesme hattını yüksek seviyede sürecek. Kesme gönderdikten sonra kesme işleyicisinden cihaz’ın kesme göndermesine sebep olan neyse bu durum çözümlenecek ve ya ileride halledilmek üzere bu bilgi not edilecek, sonra da kesme hattını tekrar düşük seviyeye çekmesi kesme işleyicisi (sürücü) tarafından sağlanacak. Bunun nasıl yapılacağı cihazdan cihaza değişiklik gösterebilir.

Kenar tetiklemeli olmasına rağmen 8259′un tasarımı gereği ilk INTA geldikten sonra hattın aktif tutulması gerekiyor. Bunun sebebi tetiklemeyi yapan sinyal’in bir gürültü (noise) olabilme olasılığı. Kesme olmadığı zamanda düşük seviyede olan hatta oluşabilecek bir gürültü tetiklemeye yol açabilir. Hat o an aktif değil ise ikinci INTA’da işlemciye özel olarak 7 vektörü dönülüyor. Buraya gerçekten bir cihaz bağlı ise, kesme işleyicisi’nin kesme’nin gerçek olup olmadığını cihaz ile konuşarak kontrol etmesi lazım.

Bu şekilde tasarlanmış kesme çıkışları ile yani hattı hem düşük, hem yüksek süren cihazların ikisi aynı hattı paylaşamaz.

Kenar Tetiklemeli Kesme Paylaşımı (Edge-Triggered Interrupt Sharing)

Kenar tetiklemeli kesmeleri paylaştırabilmek için şöyle bir yöntem kullanılabiliyor: Öncelikle anakart üzerinde ve ya kontrolörün içerisinde (bazı üretici modellerinde mevcut değil) her bir kesme hattı bir pull-up direnci ile yüksek seviyede tutuluyor. Paylaşım yapacak cihaz, kesme göndereceği zaman hattı bir süre düşük seviyede sürüyor, hattı sürmeyi bıraktığı anda hat otomatik olarak pull-up direnci sayesinde yüksek seviyeye çıkıyor. Bu şekilde kesme tespiti için gerekli kenar tetiklemesi sağlanmış oldu.

Hattı ortak kullanan diğer ISA cihazları da kesme göndermek istediklerinde hattı yalnızca düşük seviyeye çekip bırakacakları için aynı anda iki cihazın hattı kullanmasında bir sorun oluşmuyor ve hat paylaşımı yapılabiliyor. Hattı ne kadar süre düşük seviyede tutacakları için de bir standart olmadığı için, bu da cihazdan cihaza değişebiliyor. Bir cihaz düşük seviyede tuttuğu esnada bir başka cihaz da düşük seviyeye getirip hattı sürmeyi bırakabilir örneğin, halen ilk cihaz sürmeyi bırakmadıysa da ikinci cihazın kesmesi arada kaybolacaktır. Kenar tetiklemeli kesmelerde her zaman kesme işleyici zincirinin tamamının gezilmesi kritik aralıklarda kaybolabilecek kesmelerin işlenebilmesi sebebi ile yapılmalı.

Seviye Tetiklemeli Kesmeler (Level-Triggered Interrupts)

Seviye tetiklemeli modda, kesmeler kontrolörün hattın düşük ve ya yüksek seviyede bulunmasına bakarak tetikleniyordu. PCI spekleri kesmelerin bu şekilde olması gerekliliği koşulunu getiriyor. PCI cihazlarda kesme üretebilecek dört ayrı pin (INTx#) bulunuyor. Ve bu pinler aktif-düşük olarak kuzey köprüsünün aktif-düşük pinlerine bağlanıyor. Kuzey köprüsüne göre kesme girdi sayısı farklılık gösteriyor. Fakat köprünün aktif-düşük girişlerini ortak kullanan PCI cihazlarının INTx pinleri, köprü tarafından belirli ve ya programlanabilir şekilde kesme kontrolörünün pinlerine route edilerek ve de aktif-yüksek sinyale çevrilerek iletiliyor.

PCI cihaz kesme ileteceği zaman kesme hattını düşük seviyede tutuyor bu anda kesme tespit edilerek kesme işleyicisine ulaşılıyor. Buradan da cihazın isteği karşılandıktan sonra yine kesme işleyicisi tarafından cihaz hattı bırakıyor. Eğer hat halen bir cihaz tarafından aktif olarak tutuluyorsa, yeniden kesme kontrolörü kesme gönderiyor. Seviye tetiklemeli kesmelerin avantajı, hat aktif olduğu sürece tespit edilebiliyor olması. Kenar tetiklemeli kesmelerin kısa bir aralıkta tespit edilmesi gerekiyor, kesme kalıcı değil ve kritik aralıklarda da kaybolabiliyor.

Sorunlar

Edge-triggered kesme üreten cihazların bir kaç şekilde tasarlanabildiğini söyledik. İlk zamanlar da cihazın kesme hattını tek başına kullanılacağı düşünülerek çıkışlar “totem-pole” ya da “tri-state buffer” ile sürülmüş. Hat üzerinde bu şekilde tasarlanan birden fazla cihaz bulunursa ve her bir cihaz hattı aynı anda sürmeye kalkarsa veriyolu üzerinde kavgaya “bus fight” tutuşacaklardır. Belki kesme çıkışlarında “tri-state buffer” lar kullanan ama aynı anda kesme üretimi yapmayacağı garanti olan cihazlar hattı sürmedikleri zamanlarda çıkışlarını sürmeyerek yüksek empedansda bırakabilirler. Bu şekilde bir ihtimal paylaşımları mümkün olabilir.


Edge-triggered kesme üreten cihazların çıkışları “open-collector” yapıldığı takdirde ve hat üzerinde bir pullup direnci ile her zaman yüksek seviyede tutulması ancak kesme üretileceği zaman düşük seviyede bir süre tutularak hattı bıraktığı anda hattın yeniden yüksek seviyeye çıkması ile (“pullup direnci ile”) tetikleme yapılabilir. Bunun dışında çıkışta “tri-state buffer” kullanılarak da paylaşım sağlanabilir. Hat yalnızca
ya düşük seviyede sürülür ya da yüksek empedansda tutulur. (”float“) Bu şekilde tasarlanmış bir ISA cihaz örneğini şu adreste bulabilirsiniz.

PC XT mimarisi zamanında kullanılmaya başlanan ISA veriyolu yapısı başta kesme paylaşımına olanak verecek şekilde tasarlanmamış. Cihazların kesme süren kısımlarının da belirli bir standardı bulunmadığı için üreticiler farklı yöntemlerle cihazlar üretmişler. Bu yüzden kenar tetiklemeli ISA cihazlarda kesme paylaşımı pratikte mümkün olabilse de, çoğunlukla paylaşım yapılamıyor demek daha doğru. Özellikle anakart üzerinde sistem saati gibi sabit legacy kesmelerin paylaşımı mümkün değil. Sistem saati direk kesme kontrolörüne bağlı.

Aynı üreticinin ürettiği ve yaklaşık aynı işi yapan fakat tasarım kararları sebebiyle paylaştırılamayacak iki ISA cihazın “hardware hacking” ile paylaştırılabilir hale getirildiği hoş bir örneği şu adreste bulabilirsiniz. [Not: Site örnek aradığım zamanda açıktı, fakat kapanmış. Google ön belleğinden bakabilirsiniz. Fakat resimler
yok tabi ki :( ]

Seviye-tetiklemeli kesmelerde ise paylaşım mümkündü. Burada da sürücü tarafında dikkat edilmesi gereken kısımlar var. Eğer sürücüde bir hata bulunuyorsa seviye tetiklemeli kesmeler makinenin kilitlenmesine sebebiyet verebilir. Birden fazla cihazın seviye-tetiklemeli olarak hattı paylaştığını varsayalım. Her cihazın kendi üstünde bir şekilde kesmenin beklediğini işaret eden bir de yazmaç bulunduğunu düşünelim. Herhangi bir cihaz kesme ürettiğinde, kesme işleyicisi çalıştı ve paylaşılan hat için kaydedilen her bir cihazın kesme işleyicisini (”zincir”) tek tek çalıştırmaya başladı. Zincirdeki her cihazın kesme işleyicisi, cihazda hakikaten bekleyen bir kesme var mı diye bakacak, var ise yapması gerekenleri yapacak, kesme üreten cihaz bulunduğu ve isteği cevaplandığı için de kesme işleyici zincirine devam edilmeyecek, çünkü cihaz bulundu. Geri dönüldüğünde eğer başka bir cihaz da bu zaman içerisinde kesme üretmiş ve hattı aktif tutmaya devam ediyorsa, kesmeler de seviye tetiklemeli olduğundan hemen tespit edilecek ve yeniden kesme işleyicisi zincirine dönülerek, tek tek cihaz bulunmaya çalışılacak. Ki bulunarak isteği cevaplansın ve kesme üretmesi durdurulsun. İsteği cevaplanana kadar hattı aktif tutacak.

Düşünün ki zincirdeki bir kesme işleyicisi bir hata sonucunda tamam bu kesme bana ait dedi ve ben bunu hallettim dedi. Halbuki kesmeyi üreten başka bir cihaz ve bu cihazın kesme işleyicisine de girilemedi. Geri dönüldüğü anda hat aktif olmaya devam edeceğinden sürekli işlemciye kesme gelecek. İşlemci de kesmelerden başka bir iş yapamaz hale gelecek. Makine bir döngüye girerek kilitlenecek.