Linux 6.2’nin kaldırılan yamalara rağmen performansı geri getirdiği söyleniyor

Adanali

Member
Linux 6.2, bu hafta Pazar ile Pazartesi arasındaki gecede ışığı gördü. Rust entegrasyonu “Merhaba dünya!” nişinden çıkar. BPF, uzun vadeli modül programlama için uygun olmalıdır. Çekirdek ayrıca güvenlik özelliklerini de geliştirir.


Beklendiği gibi, çekirdek, sekizinci sürüm adayı (rc8) şeklinde ek bir haftalık testten geçti. Ancak bu sefer geç keşfedilen ciddi hataların düzeltilmesi gibi teknik sebepler yoktu. Aksine, öncekinin fazladan turu, gecikmenin dolaylı nedeniydi. Linux 6.2 üzerinde çalışmaya başlama, 6.1’in geç yayınlanması nedeniyle Noel ve Yeni Yıl tatillerine ertelendi. Geliştiricilerin tatil için uzakta olmasına rağmen yeterli test yapılmasına izin vermek için Torvalds, başlangıçta başka bir Yayın Adayı 8’e girmek istediğini defalarca vurguladı. rc7’den sonra ifadesini tuttu ve ekstra test haftası geldi. “Normal” koşullar altında Torvalds, rc7’den sonra en son Linux 6.2’yi yayınlardı.

Kısmen geri yüklenen performans


Linux 5.19, Spectre Retbleed varyantına karşı çekirdek yamalarını tanıttı. Bunlar zaten rc7 sürüm adayında ek bir rc8 şeklinde bir yeniden çalışma ve ardından bir haftalık test gerektiren performans sorunlarına neden oldu. Yamalar, Intel’in tescilli donanım tabanlı “Dolaylı Şube Kısıtlama Spekülasyonuna” (IBRS) dayanıyordu. IBRS çalışır, ancak bazen Intel Skylake CPU’larda ciddi performans düşüşlerine neden olur. Linux ayrıca 5.19 sürümünden etkilenmiştir.


Linux 6.2 artık buna karşı çıkıyor ve Skylake tabanlı sistemlere daha hızlı bir saldırı getiriyor. Çekirdek önyükleme seçeneği retbleed=stuff tamamen yazılım çözümünü etkinleştirir. IBRS gerektirmez ve bunları “atlar”.

Orijinal güvenlik sorunu


İşlemcide “Dönüş Yığın Tamponu” (RSB) adında özel bir yığın vardır. Bu, spekülatif talimat yürütme sırasında sistemin olası dönüş hedefleri olarak kaydettiği dönüş adreslerini kabul eder. Bu RSB yalnızca 16 adres içerebilir. Yığına bir başkasının itilmesi gerekiyorsa, eski adres kaybolur. Bu, çağrı zincirlerinin uzadığı durumdur ki bu, Linux çekirdeğinde alışılmadık bir durum değildir.


Böyle bir yığın “geri alınırsa” ve eski adresler bu şekilde kaybedilirse, yığın kaçınılmaz olarak yetersiz kalır. İade adresleri eksik. Ancak CPU spekülasyon mekanizması bu noktada durmaz, bunun yerine “Branch History Buffer”a (BHB) geçer. Bunda, önceki atlamalar kaydedilir ve yeni spekülatif talimat yürütme tahminleri için temel olarak hizmet eder.

Bu BHB, kötü niyetli kodu yürütmek için yanlış dönüşlerle özel olarak “eğitilebilir”. Bu “eğitim”, kullanıcı alanında gerçekleşir ve çekirdekteki ayrıcalıklı kodu etkiler. Retbleed, RBS’yi geçer, ardından yanlış eğitilmiş BHB’ye kayar.

sorun giderme


IBRS, kullanıcı alanında öğrenilen şube hedeflerini çekirdek alanına atarak buna karşı koyar. Çekirdek alanında, bu çok büyük bir ek yüke neden olur. Yeni yaklaşım, temel sorunun – RBS taşması – meydana gelmemesini ve ilk etapta BHB’nin kullanılmamasını sağlar. Bir “gölge muhasebe”, bir sayaç aracılığıyla yığın derinliğinin kaydını tutar. Ayrıca, çağrı yığını ve ayrıca RSB, dönüş hedefleriyle önceden tahsis edilmiştir. Bunlar, BHB yürürlüğe girmeden önce spekülasyonu sonlandıran bir CPU talimatına (INT3) yol açar.

Bu aynı zamanda çekirdekte ucuz olma eğilimindedir. Bu muhasebe işlevlerinden önce ve sonra uygun işlev çağrıları yapılmalıdır. Ayrıca saat döngülerine mal olurlar, ancak IBRS’den daha az güç tüketmeleri konusunda umut verirler.

Daha fazla pas


İlk büyük çekirdek olan Linux 6.1, Rust’ta modül programlamaya da öncülük etmiştir. Bir “Merhaba dünya!” ama mümkün değildi. Beklendiği gibi, yeni çekirdek gerekli temel yapıları ekler. C ve Rust dünyasının bir bağlayıcısı olarak, karmaşık makro #[vtable] beklendiği gibi dahil edildi. Rust makrosu, Rust özelliklerinden C yapıları oluşturmaya yardımcı olur. Rust, bir özellikte tanımlanmış ancak uygulanmamış işlevleri kolayca temsil edebilir.

Çekirdekteki C kodu, bir işlevi “uygulanmadı” olarak işaretlemek için yapılarında boş işaretçiler kullanır. Bir Rust özelliğinden bir C yapısı oluşturmak için, ilgili kodun boş işaretçileri nereye koyacağını bilmesi gerekir. #[vtable] özellik olarak temsil edilen bir tabloda bir özellik tarafından tanımlanan her işlev için özel bir sabit üye üretir. Uygulananlar değeri alır truediğerleri false. Bu, C yapısını oluşturan kodun derleme zamanında uygulanmayanları algılamasını ve boş işaretçiler eklemesini sağlar. Bu, örneğin C yapısı için önemlidir. file_operationsbir sürücü tarafından desteklenen özelliklerin bir listesini içerir.

Veri türleri ve hata işleme


Rust iki tür dizgi biliyor str VE String. İlk tip, bir dizgeye (ödünç alınan) bir referanstır, ikincisi ise dizgenin kendisini içerir. Bu ikisi, iki pas varyantında çekirdek pası desteğini oluşturur CString VE CStr C’deki dizelerle aynı işlevi yerine getiren özel bir pas türü de vardır. BStr, bayt dizelerini temsil eder. Bununla makroyu kullanabilirsiniz. b_str!() Dizeler, ASCII olmayan karakterleri de içeren bayt karakterli dizelere dönüştürülür.

Vektörler için yeni kurucular eklendi. Ek olarak, Rust gerektiğinde sekiz çekirdek günlüğü seviyesinin tümünü kullanabilir. pr_*-Özellikler eklendi. Şimdiye kadar yalnızca iki günlük düzeyi dahil edilmiştir pr_info!() VE pr_emerg!() kullanılabilir Çekirdek ayrıca tüm hata kodlarını sağlar errno-base.h ve Hata türü için Rust özelliğinin uygulamaları. Yeni iddia ve hata ayıklama makroları, yeni Rust setini tamamlar.

Rust entegrasyon değişikliklerine genel bir bakış, geliştirici Miguel Ojeda’nın ilgili taahhüdünde bulunabilir. Rust entegrasyonu daha sonra önemli ölçüde arttı ve “Merhaba dünya!” Demo köşesinden ayrıldı. Ancak, Rust’taki ilk pratik modüllerin çekirdekte görünmesi biraz zaman alacaktır. Yaklaşan çekirdek 6.3 için sonraki uzantılar, yeni türlere ek olarak yeniden çalışmayı da içeren çekme istekleri olarak zaten mevcuttur. alloc ve sonra temel şeyleri kucaklayın.



Haberin Sonu
 
Üst