Kesmelerin Kontrolü (Overall Control of Interrupts) Linux OS


Linux kesmeleri işleyen yol nedeniyle tasarım ve çalışan donanım değişiklikleri, yılda biraz değişti. Ilk günlerinde kesmeleri PC'nin görünümü oldukça basitti; Onlarla başa çıkmak için sadece 16 kesme hatları ve bir işlemci vardı. Modern donanım çok daha fazla kesmeleri sahip olabilir ve aynı zamanda akıllı (ve programlanabilir) şekilde birden fazla işlemci arasında kesmeler dağıtabilirsiniz fantezi gelişmiş programlanabilir kesme denetleyicileri (APICS) ile donatılmış olabilir.

Ne mutlu ki, Linux sürücüsü seviyesinde görece az uyumsuzlukları ile bu değişikliklerin tümü ile başa çıkmak mümkün olmuştur. Böylece, arayüz, birçok çekirdek sürümleri arasında bazı farklılıklar ile bu bölümde çalışmalarında nitelendirdi. Bazen işler güzel dışarı çalışır.

Unix benzeri sistemler devre dışı bırakmak ve yıllarca kesmeleri etkinleştirmek için fonksiyonları cli ve sti kullandık. Modern Linux sistemlerde ise, doğrudan bunları kullanarak önerilmez. Herhangi bir rutin çağrıldığında kesmeler etkin olup olmadığını bilmek için gittikçe imkansız; Böylece, sadece dönmeden önce sti ile kesmelerini etkinleştirmek kötü bir uygulamadır. Sizin işlevi kesmeleri hala devre dışı bırakılması beklediği bir işlev için iade edebilir.

Eğer kesmeler devre dışı bırakmalısınız Dolayısıyla, eğer aşağıdaki aramaları kullanmak daha iyidir:

imzasız uzun bayrakları;

    save_flags (bayraklar);
    cli ();

    / * Bu kod * / devre dışı kesmeleri ile çalışır

    restore_flags (bayraklar);
Bir & operatörü olmadan - bu save_flags makro ve doğrudan bayrakları tutmak için değişken geçirilen unutmayın. İşte bu makro kullanımı önemli bir kısıt da: save_flagsand restore_flags aynı işlevi çağrılmalıdır. Diğer fonksiyon inlined sürece başka deyişle, başka bir işleve bayrakları geçemez. Bu kısıtlama, bazı mimariler üzerinde çalışacak ama diğerleri başarısız olur görmezden kodlayın.

Giderek, ancak, önceki örnekte olduğu gibi, hatta kod mümkünse önerilmez. Çok işlemcili bir sistemde, kritik kod sadece kesmeleri devre dışı bırakarak korunamaz; kilitleme mekanizmasının bir çeşit kullanılmalıdır. (Daha sonra bu bölümde, "Spinlocks Kullanma" kapsamında) gibi spin_lock_irqsave olarak Fonksiyonlar kilit sağlamak ve birlikte kontrol kesme; Bu işlevler kesmeler varlığında eşzamanlılık kontrol etmek için sadece gerçekten güvenli yoldur.

cli Bu arada, sistemdeki tüm işlemcilerin kesmeleri devre dışı bırakır ve böylece bir bütün olarak sistemin performansını etkileyebilir. [36]

[36] gerçeği biraz daha karmaşık, bu daha. Zaten bir kesme taşıma yapıyorsanız, cli yalnızca geçerli CPU üzerindeki kesmeler devre dışı bırakır.

Böylece, açık çağrılar cli ve ilgili fonksiyonlar yavaş yavaş çekirdeğin çok gelen yok olmaktadır. Orada bir aygıt sürücüsünde onlara ihtiyacımız durumlar vardır, ancak bunlar nadirdir. Cli çağırmadan önce, gerçekten sistemde tüm kesmeler devre dışı bırakmak için ihtiyacınız olup olmadığını düşünün.

Comments