Linux'ta bir Kesinti nasıl yapılır?


35

Sadece biliyorum Interruptbir olan hardware signal assertionbir işlemci pimi içinde neden oldu. Ancak Linux işletim sisteminin nasıl idare ettiğini bilmek istiyorum.
Bir kesinti olduğunda ne olur peki?


tldp.org/LDP/tlk/dd/interrupts.html , sorduğunuz soru ile ilgili her şeyi açıklıyor
John

Yanıtlar:


40

İşte düşük seviyeli işlemenin üst düzey bir görünümü. Basit bir tipik mimariyi tarif ediyorum, gerçek mimariler daha karmaşık olabilir veya bu ayrıntı düzeyinde önemli olmayan şekillerde farklı olabilir.

Bir kesinti olduğunda, işlemci kesintilerin maskelenmiş olup olmadığına bakar. Eğer öyleyse, maskelenene kadar hiçbir şey olmaz. Kesintiler maskelenmediğinde, beklemedeki kesintiler varsa, işlemci birini seçer.

Ardından işlemci, hafızada belirli bir adrese dallanarak kesinti yapar. Bu adresteki kod kesme işleyicisi olarak adlandırılır . İşlemci orada dallandığında, kesintileri maskeler (böylelikle kesme işleyicisinin özel kontrolü vardır) ve bazı kayıtların içeriğini bir yere (genellikle başka kayıtlara) kaydeder.

Kesme işleyicisi, genellikle veri göndermek veya almak için kesmeyi tetikleyen çevre birimiyle iletişim kurarak yapması gereken şeyi yapar. Kesinti zamanlayıcı tarafından kaldırıldıysa, işleyici işletim sistemi zamanlayıcısını tetikleyerek farklı bir iş parçacığına geçebilir. İşleyici yürütmeyi tamamladığında, kaydedilen kayıtları geri yükleyen ve kesintileri kesen özel bir kesme komutundan geri dönüş komutu yürütür.

Kesme işleyicisi hızlı bir şekilde çalışmalıdır, çünkü diğer kesintilerin çalışmasını önler. Linux çekirdeğinde, kesme işlemi iki bölüme ayrılmıştır:

  • “İlk yarı”, kesme işleyicisidir. Gerekli olanı yapar, tipik olarak donanımla iletişim kurar ve çekirdek bellekte bir yere bayrak koyar.
  • “Alt yarısı”, başka herhangi bir gerekli işlemi yapar; örneğin, verileri işlem belleğine kopyalamak, çekirdek veri yapılarını güncellemek vb.

Bu konuda her zamanki gibi, daha fazla bilgi için Linux Aygıt Sürücüleri ; bölüm 10 , kesintilerle ilgili.


22

Gilles zaten , genel olarak bir kesintinin durumunu açıkladı ; aşağıdakiler özellikle Intel mimarisindeki Linux 2.6 için geçerlidir (bunun bir kısmı da Intel'in özelliklerine dayanmaktadır).

Kesinti, işlemci tarafından yürütülen talimatların sırasını değiştiren bir olaydır.
İki farklı türde kesinti vardır:

  • Senkron kesme (İstisna) gerçekleştirirken CPU tarafından üretilen
  • Diğer donanım aygıtları tarafından verilen zaman uyumsuz kesme (Kesme)

İstisnalar, programlama hatalarından kaynaklanır (fe, Divide error , Page Fault , , çekirdek tarafından ele alınması gereken Taşma ) kaynaklanır. Programa bir sinyal gönderir ve hatadan kurtulmaya çalışır.

Aşağıdaki iki istisna sınıflandırılmıştır:

  • Anormal bir durum tespit edilirken CPU tarafından üretilen işlemci tarafından algılanan istisna ; üç gruba ayrılır: Hatalar genellikle düzeltilebilir, Tuzaklar bir infaz bildirir, Aborts ciddi hatalardır.
  • Programcı tarafından talep edilen programlanmış istisna , bir tuzak gibi ele alınır.

Kesintiler, G / Ç cihazları (klavye, ağ adaptörü, ..), aralık zamanlayıcılar ve (çok işlemcili sistemlerde) diğer CPU'lar tarafından verilebilir. Bir kesinti gerçekleştiğinde, CPU mevcut talimatını durdurmalı ve yeni gelen kesintiyi gerçekleştirmelidir. Eski kesintili işlem durumunu, kesinti ele alındıktan sonra (muhtemelen) devam ettirmek üzere kaydetmesi gerekir.

Kesmelerin ele alınması hassas bir iştir:

  • Kesintiler her an gerçekleşebilir, çekirdek en kısa sürede ortadan kaldırmaya çalışır.
  • Bir kesme, başka bir kesme tarafından kesilebilir
  • Çekirdeğin hiç kesilmemesi gereken bölgeler var.

İki farklı kesme seviyesi tanımlanmıştır:

  • G / Ç aygıtları tarafından verilen maskelenebilir kesintiler ; iki durumda olabilir, maskeli veya maskesiz. Sadece maskesiz kesmeler işleniyor.
  • Maske edilemez kesmeler ; kritik arızalar (donanım arızası gibi); CPU tarafından daima işlenir.

Her donanım cihazının kendine ait Kesme İsteği (IRQ) hattı vardır. IRQ'lar 0'dan başlayarak numaralandırılır. Tüm IRQ hatları bir Programlanabilir Kesinti Kontrol Cihazına (PIC) bağlanır. PIC, IRQ'ları dinler ve bunları CPU'ya atar. Belirli bir IRQ hattını devre dışı bırakmak da mümkündür.
Modern çok işlemli Linux sistemleri genellikle IRQ isteklerini CPU'lar arasında eşit olarak dağıtan daha yeni olan Gelişmiş PIC (APIC) içerir.

Bir kesme veya istisna ile bunun işlenmesi arasındaki orta adım Kesme Kesme Tanımlayıcı Tablosu (IDT). Bu tablo her kesme veya istisna vektörünü (bir sayı) belirtilen bir işleyiciyle ilişkilendirir (fe Bölme hatası işlev tarafından ele alınır divide_error()).

IDT aracılığıyla, çekirdek tam olarak meydana gelen kesilme veya istisna ile nasıl başa çıkılacağını bilir.


Öyleyse, bir kesinti olduğunda çekirdek ne yapar?

  • CPU, her komuttan sonra (A) PIC'den bir IRQ olup olmadığını kontrol eder.
  • Öyleyse, alınan vektörü bir işleve eşlemek için IDT'ye danışın.
  • Kesmenin yetkili bir kaynak tarafından verilip verilmediğini kontrol eder.
  • Kesilen işlemin kayıtlarını kaydeder
  • Kesmeyi işlemek için uygun işlevi çağırın
  • Kesilen işlemin son kaydedilen kayıtlarını yükleyin ve devam ettirmeye çalışın

Eğer açıklamak Can "(A) PIC bir IRQ varsa her talimat sonra CPU çekleri" . Tam olarak nasıl oluyor? VIPBayraklarda -flag ile ilgili kayıt mı yoksa herhangi bir şekilde mi? Şimdiden teşekkürler
red0ct

7

Öncelikle kesme işlemine katılan tüm katılımcılar, çevresel donanım aygıtları, kesme denetleyicisi, CPU, işletim sistemi çekirdeği ve sürücülerdir. Periferik donanım cihazları, kesinti oluşumundan sorumludur. İşletim sistemi çekirdeğinden dikkat çekmek istediklerinde kesme istek satırlarını iddia ediyorlar. Bu sinyaller, kesme sinyallerinin toplanmasından sorumlu olan kesme denetleyicisi tarafından çoğaltılır. Ayrıca, kesme sinyallerinin CPU'ya geçirileceği sıranın belirlenmesinden de sorumludur. Kesme denetleyicisi, belirli kesme isteği satırını (IRQL) geçici olarak devre dışı bırakabilir ve yeniden etkinleştirebilir (IRQL maskeleme). Kesme denetleyicisi geçişi, CPU'ya sıralı olarak kesme istekleri topladı. CPU, her komutun yürütülmesinin tamamlanmasından sonra CPU kontrol eder, kesme denetleyicisinden bekleyen herhangi bir kesme isteği olup olmadığını kontrol eder. CPU bekleyen bir istek olduğunu tespit ederse ve Dahili CPU kontrol kaydında VEYA Kesme Enable bayrağı ayarlanırsa CPU kesme işlemine başlar. Gördüğünüz gibi, CPU'daki Kesme bayrağını manipüle ederek ve kesme denetleyicisi ile iletişim kurarak, Linux çekirdeği kesme kabulünü kontrol edebilir. Örneğin, Linux belirli bir cihazdan kesinti kabulünü devre dışı bırakabilir veya kesinti kabulünü tamamen devre dışı bırakabilir. Linux çekirdeği, kesme kabulünü kontrol edebilir. Örneğin, Linux belirli bir cihazdan kesinti kabulünü devre dışı bırakabilir veya kesinti kabulünü tamamen devre dışı bırakabilir. Linux çekirdeği, kesme kabulünü kontrol edebilir. Örneğin, Linux belirli bir cihazdan kesinti kabulünü devre dışı bırakabilir veya kesinti kabulünü tamamen devre dışı bırakabilir.

İşlemci bir kesme isteği aldığında ne olur? Birincisi, CPU Araya Girme Bayrağını sıfırlayarak kesintileri otomatik olarak devre dışı bırakır. Kesinti işleme tamamlandıktan sonra yeniden etkinleştirilirler. Aynı zamanda CPU, kullanıcı kodundan çekirdek moduna geçmek için CPU'yu, kesilen kodun yürütülmesine devam edebilecek şekilde değiştirmek için gereken asgari miktarda işi yapar. CPU, kontrolün geçeceği kodun adresini bulmak için Linux çekirdeği tarafından doldurulmuş özel CPU kontrol yapılarına başvurur. Bu adres, Linux çekirdeğinin bir parçası olan ilk kesme işleyicisinin talimatının adresidir.

Kesinti işleminin ilk adımı olarak çekirdek, sistemde ne tür bir olayın gerçekleştiğini belirlemek için alınan kesilme vektörünü tanımlar. Kesinti vektörü, Linux'la başa çıkmak için hangi eylemlerin gerçekleştirileceğini tanımlar. İkinci adım olarak Linux, CPU kayıtlarının geri kalanını (otomatik olarak CPU tarafından kaydedilmemiş) ve kesintiye uğrayan program tarafından potansiyel olarak kullanılabilecek şekilde kaydeder. Bu çok önemli bir eylemdir, çünkü Linux'un kesintiye uğramış programa göre şeffaf bir şekilde kesintileri işlemesini sağlar. Üçüncü adım olarak, Linux, çekirdek ortamını ayarlayarak ve bunun için gereken CPU durumunu ayarlayarak çekirdek moduna geçmeyi başarır. Ve son olarak, vektör bağımlı kesme işleyicisi denir. (BUILD_INTERRUPT3 makrosuna arch \ x86 \ kernel \ entry_32 içinden bakabilirsiniz. S x86 mimarisi ile ilgili ek detayları almak için ilgili örnek) Çevresel cihazlarda bu bir do_IRQ () rutinidir. (Arch \ x86 \ kernel \ irq.c'ye bakın)

Vektör bağımlı kesme işleyicisi genellikle irq_enter () ve irq_exit () çağrılarıyla sarılır. Bu fonksiyonların bir çifti içine alınmış kod alanı, bu gibi diğer alanlara göre atomiktir ve ayrıca cli / sti çiftlerine göre atomiktir. Irq_enter () ve irq_exit (), kesme işlemiyle ilgili bazı istatistikleri de yakalar. Son olarak, çekirdek, alınan kesme vektörüne atanan irq numarasını bulmak için vector_irq tablosuna bakar ve handle_irq () öğesini çağırır (arch \ x86 \ kernel \ irq_32.c'den).

Bu noktada, Linux'ta kesme işleminin ortak kısmı sona erer, çünkü çekirdek, irq tanımlayıcısının bir parçası olarak aygıt sürücüsü tarafından yüklenen aygıta bağlı aygıta bağlı işleyicisi yordamına bakar ve onu çağırır. Eğer böyle bir işleyici sürücü tarafından kurulmamışsa, çekirdek, kesme denetleyicisindeki kesmeyi onaylar ve genel kesme işlemcisinden çıkar.

Kesinti işleminin sona ermesinden sonra, çekirdek daha önce kesilmiş olan programın durumunu geri yükler ve bu programın çalışmasını sürdürür.


CPU consults with special CPU control structures filled by Linux kernel to find an address of code to which control will be passed.Evet! Bu özel kontrol yapılarının ne olduğunu merak ediyorum ...
otomat

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.