Sadece biliyorum Interrupt
bir olan hardware signal assertion
bir 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?
Sadece biliyorum Interrupt
bir olan hardware signal assertion
bir 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?
Yanıtlar:
İş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:
Bu konuda her zamanki gibi, daha fazla bilgi için Linux Aygıt Sürücüleri ; bölüm 10 , kesintilerle ilgili.
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:
İ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:
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:
İki farklı kesme seviyesi tanımlanmıştır:
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?
VIP
Bayraklarda -flag ile ilgili kayıt mı yoksa herhangi bir şekilde mi? Şimdiden teşekkürler
Ö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 ...
Teori yönünden, hemen hemen her şey açıklanmıştır. Ancak, çekirdek kesintisi işleme kodu çerçevesine ilişkin açıklama arıyorsanız, aşağıdaki bağlantıyı yapmanız gerekir: Çekirdek kesinti işleme içinde bir kod yürüyüşü
Ve eğer kesme ve kesme işleyicileri hakkında hala teori arıyorsanız, o zaman şunu okumanı öneririm: Kesme ve kesme işlemcilerini anlama