Interupt’lar Üzerine
Bu yazıda işletim sistemler hakkında okuduğum kitapta yer alan interrupt’ler kısmından çıkardığım özeti yazdım. Özetini çıkardığım kitabı yazının sonunda paylaştım. Bu özet’te çevre birimler, bellek ve CPU arasındaki ilişkiyi anlattım. Daha sonra bu ilişkinin devam ettirilebilmesi için gerekli ve yazımızın asıl konusu olan interrupt’lere genel bir bakış attıp daha sonra uygulanmasını anlattım.
İçindekiler;
• Başlangıç
• 1- Interrupts
→ 1.1- Önbakış
→ 1.2- Uygulama
Başlangıç
Genel amaçlı bilgisayar sistemleri bir yada birden fazla CPU’dan ve birbirlerin BUS hattı ile bağlı çeşitli device controller’den oluşur. Her device controller’ler belirli tür cihazları yönetmekle görevlidir (örn: ses kartı, disk sürücüleri, monitör). Device controller’ler kendilerine ait yerel geçici (local buffer) depolama alanlarına ve özel-amaçlı register’lere sahiptir. Device controller’in amacı yönettiği cihazlar ile kendisinde bulunan local buffer arasında veri transferini sağlamaktır.
İşletim sistemleri her device controller için device driver’lere sahiptir. Device driver, yükümlü olduğu device controller’i tanıyan ve nasıl çalıştığını bilen bir yazılımdır. İşletim sistemi ile device controller arasında arayüz olarak görev alır. İşletim sistemi eğer klavyeden veri almak istersen klavyeyi yöneten device controller’e bilgi vermesi gerekir ama her device controller donanıma özel olduğu için işletim sisteminin dünyada bulunan tüm klavyeleri tanıması mümkün ve mantıklı değildir. Bunun yerine o device controller’i tanıyan ve işletim sistemine özgü yazılmış olan device driver’e söyler. Device driver’de device controller’e ne yapacağını söyler ve işlem başlar. Bu yüzdendir yeni bir donanım satın aldığınızda (örn: çizim tableti), onu kullanmaya başlamadan önce websitesinden işletim sisteminize ve cihazınıza uygun device driver’ini indirip kurmanız. Aksi taktirde işletim sistemi çizim tabletinizi göremez ve yönetemez.
Buraya kadar işletim sistemi ile donanım arasındaki ilişkiden bahsettik. Şimdi asıl konumuz olan Interrupt’lara geçelim.
1- Interrupts (Kesmeler)
İşletim sistemi klavyeden veri okumak gibi basit bir I/O işlem yapacağını varsayalım. Bu I/O işlemi, device driver’in device controller üzerinde bulunan register’lere gerçekleştirilecek işleme uygun verinin yüklenmesi ile başlar. Device controller, bu registerlerdeki veriyi okur ve bu veriye uygun işlemi gerçekleştirmesi için klavyeyi yönetir. Klavyeden gelen veriyi device controller kendi üzerinde bulunan local buffer register’ine yükler. Verinin ilgili register’e aktarılması bitince device controller, device driver’ini işlemin bittiğini karşı bilgilendirir. Device driver daha sonra sistemin kontrolünü muhtemelen bu verinin okunması için işletim sisteminin diğer parçalarına verir. Device driver, farklı operasyonlar için de farklı geri dönüş değerleri döndürebilir.
Peki device controller klavyeden veriyi okuyup local buffer’e koyduktan sonra device driver’ini nasıl bilgilendirir?
Bu interrupt’ler sayrsinde gerçekleştirilir.
1.1- Önbakış
Donanım, sistem bus(yukarıdaki resimde yeşille gösterilen yol) vasıtasıyla CPU’ya sinyal göndererek interrupt gerçekleştirebilir. Interrupt’lar işletim sistemi ile donanım arasında etkleşimin gerçekleşmesini sağlayan anahtar mekanizmadır.
CPU’ya interrupt geldiği zaman, o an ne yapıyorsa yaptığı şeyi durdurur ve bellekte sabit bir adresteki işi yapmaya başlar. Bu sabit adres, gönderilen interrupt için service routine’nin başlangıcıdır yada interrupt service routine’in başlangıç adresi tutulur. Burada ki interrupt service routine çalışmayı bitirdikten sonra CPU çalışmayı yarıda bıraktığı işleme geri döner.
Interrupt’ler bilgisayar mimarisinin önemli bir parçasıdır. Her yapının kendine ait interrupt mekanizması vardır.
Yapılan interrupt’ler, sistemin kontrolünü doğru interrupt service routine’sine yönlendirmelidir. Sistemde çok sık interrupt gerçekleştiği için ayrıca bu yönlendirmenin çok hızlı olması gerekmektedir. Bu hızı sağlamak için sistemde bulunan tüm interrupt service routine’lerin başlangıç adreslerini tutan bir tablo kullanılabilir. Bu tabloya interrupt vector denir. Bu tablo belleğin en alt kısmında (genelde 0 ile ilk bir kaç yüz arasında) bulunur. Bu tabloda tutulan başlangıç adresleri birbirinden farklı sayılarla indekslenir. İşte bunlar intterupt istekleridir. Her isteğin farklı numarası vardır. Bu numaraya göre interrupt vector tablosunda tutulan interrupt service routine çalıştırılır.
Ayrıca bu mekanizmada, interrupt gerçekleştiği sırada CPU’da çalışan şeyin(ileriki yazılarda bu şey process olarak adlandırılacak) tüm bilgileri kaydedilir böylece interrupt işlemi bittikten sonra CPU eski işine geri dönebilmesi için gerekli tüm bilgiler sağlanır.
1.2- Uygulama
CPU, interrupt-request line olarak isimlendirilen bir hatta sahiptir. Her çalıştırdığı instruction’dan sonra burayı kontrol eder. Eğer CPU, controller’in buraya sinyal gönderdiğini tespit ederse buradaki interrupt sayısını okur ve interrupt vector tablosundaki bu numarayla indekslenmiş routine handler’ine atlar ve ordan çalışmaya devam eder.
Özetle, device controller interrupt-request line’yi kullanarak sinyal gönderir (raises), CPU sinyali tespit eder (catches) ve uygun interrupt routine handler’ini çalıştırır (dispatches), handler sinyali gönderen cihazın isteğini yaptıktan sonra sinyali temizler (clears).
Tabi her şey bu kadar mükemmel değildir. İşletim sistemi aşağıdakileride gerektiren daha sofistike bir mekanizmaya sahiptir:
- CPU’da çalışan şey önemliyse gelen sinyalin ertelenebilmesi
- CPU’nun dispatch işleminin daha etkili bir yolu
- Çok katmanlı interrupt’ler gerekir. Böylece işletim sistemi, interrupt sinyallerini daha az önemliden daha önemliye göre sıralama yapabilmeli ve önem sırasına göre gelen sinyalleri işleyebilmeli.
Bu gereksinimler, CPU ve interrupt-control hardware tarafından sağlanır.
Bir çok CPU’lar 2 tane interrupt request line’ye sahiptir. Bir tanesi Nonmaskable Interrupt. Bu yol geri döndürülemeyen bellek hataları gibi önemli olaylar için ayrılmıştır. Diğeri Maskable Interrupt. Bu yoldan gelen sinyaller CPU tarafından görmezden gelinebilir. CPU’da çalışan şey önemli olduğu ve yarıda kesilmemesi gerektiği durumlarda görmezden gelinebilir sinyaller için kullanılır (örn: device controller).
Interrupt mekanizması ayrıca interrupt priority levels sağlar. Bu level’ler CPU’nun tüm interrupt’leri maskelemeden yüksek öncelikli olanları düşük öncelikli olanlardan daha önce ele almabilmesine izin verir.
Interruptlar ile ilgili olan özet niteliğindeki bu yazım buraya kadar.
Yazının en üstünde belirttiğim kitap:
https://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz-ebook/dp/B07CVKH7BD