windows-drivers-rs - Rust ile Windows sürücü geliştirmeyi mümkün kılan platform
(github.com/microsoft)- Windows Drivers’ı Rust ile geliştirmeyi mümkün kılan bir Rust crate koleksiyonu olup, WDM ve WDF sürücü geliştirme modellerini desteklemeyi hedefler
- Başlıca bileşenler; WDK derleme yapılandırması için
wdk-build, WDK API’leri için doğrudan FFI bağları sunanwdk-sys, güvenli ve idiomatik WDK API bağları sağlayanwdk, panic handler içinwdk-panic,allocdesteği içinwdk-allocvewdk-sysdoğrudan bağlarının kullanımını kolaylaştıran makro koleksiyonuwdk-macros'tur - WDM, KMDF, UMDF sürücüleri ve Win32 Services desteği düşünülerek hazırlanmıştır; ayrıca WDK 22H2 ve sonrasında yer alan tüm WDF sürümlerini desteklemeyi içerir
crates.io'da yayımlanan crate şu anda yalnızca KMDF v1.33 desteklemektedir; diğer yapılandırmalara ait bağlar,windows-drivers-rsklonlanıpwdk-sysiçindekibuild.rsayarları değiştirilerek üretilebilir- Kullanım akışı; Cargo
libpaketi oluşturma,wdk-build,wdk,wdk-sys,wdk-alloc,wdk-panicbağımlılıklarını ekleme,cdylibayarı yapma, WDK metadata ayarlama,build.rsiçindewdk_build::configure_wdk_binary_build()çağırma,DriverEntryekleme vecargo makeçalıştırmadan oluşur- Kernel Mode crate’leri olan KMDF ve WDM sürücülerinde panic stratejisi olarak
abort,#![no_std]ve panic handler ayarı gerekir - Rust standart kütüphanesinin
allocmodülünü kullanmak içinwdk_alloc::WdkAllocatorile global allocator ayarı yapılmalıdır
- Kernel Mode crate’leri olan KMDF ve WDM sürücülerinde panic stratejisi olarak
- Derleme gereksinimleri;
bindgeniçinlibclang, derleme sonrası işlemler içincargo-makeve geçerli bir WDK ortamıdır; önerilen yöntem eWDK developer prompt içine girmektir cargo make, varsayılan davranışında sürücüyü derler ve paketler; sonuç olarak imzalı sürücü paketi ileWDRLocalTestCert.cerdosyasıtarget/<Cargo profile>/packagealtında veya hedef mimari yolunda oluşturulurcargo make default --target <TARGET TRIPLE>,--release,--features <FEATURES>,+<TOOLCHAIN>gibi argümanların iletilmesini destekler; ayrıcaWDK_BUILD_ENABLE_SIGNTOOL_VERIFY=trueayarıyla üretilen.sysve.catdosyalarının imza doğrulama adımı etkinleştirilebilir- Yeni Cargo eklentisi
cargo-wdk, Rust sürücüsü derlemede önerilen araç olarakcargo-makein yerini almak üzere geliştirilen bir Preview durumundadır - WDM, KMDF ve UMDF için minimum örnekler examples dizininde bulunur; sürücü oluşturma örnekleri ise Windows-rust-driver-samples içinde görülebilir
- Hâlâ geliştirmesinin erken aşamasındadır ve production use için henüz önerilmemektedir
3 yorum
Hacker News yorumları
Hatırlamayanlar için: Mark Russinovich, patronunun koltuğunu devralıp bir sonraki MSFT CEO adayı olarak anılmadan önce, Redmond mühendislerinin NT kernel geliştirmeyi öğrenmek için gittiği bir yazılım araçları ve NT kernel danışmanlık şirketi işletiyordu.
Ayrıca Sony'nin DRM rootkit'ini, Symantec'in rootkit benzeri dosya koruma özelliğini ortaya çıkardı; Best Buy'ın ERD Commander'ı korsan kullandığını da yakaladı.
2014'te LinkedIn'i uçurmuş olmam şimdi biraz içime oturuyor. Tüm Valley ve Mark'ın birinci derece bağlantı olduğu hesaptı; yine de görece tanınmamanın özgürlüğü ve çevikliği var. Ne kadar yaptığını, kazandığını ve kimi tanıdığını anlatmanın anlamsız olduğuna dair Desmond Dekker reggae şarkısı hangisiydi?
Bu ölçekteki şirketlerin gerçek kaynak koduna ve mühendislere erişim gibi çok daha avantajlı bir konumda olmasına rağmen bunu kendi başlarına iyi yapamamaları oldukça ilginç. Bu üçüncü taraflar, en azından Levin, büyük ölçüde tersine mühendisliğe dayanmak zorundaydı.
https://newosxbook.com
Dünyada Windows kullanan neredeyse her şirketin en az bir Sysinternals aracı kullandığını düşünürsek, Sysinternals'ın etkisi belki Azure'un kendisinden bile büyük olmuş olabilir.
MSFT'nin Mark Russinovich ve ekibini acquihire etmesinin nedeni de bu değil miydi zaten?
İlk kitabından edindiğim izlenim, dünyayı aşırı siyah-beyaz gördüğüydü.
Orijinal tweet: https://twitter.com/markrussinovich/status/17057307039574058...
http://farside.link/twitter.com/markrussinovich/status/17057...
Güzel /s ama bu pek Rust'a özgü değil:
pub struct QueueContext {
buffer: PVOID,
length: usize,
timer: wdf::Timer,
current_request: WDFREQUEST,
current_status: NTSTATUS,
spin_lock: wdf::SpinLock,
}
Linux kernel'ında Rust sürücü yazarken de benzer bir sorun var; C ile birlikte çalışan diğer projelerde de aynı.
NTSTATUS gibi tiplerin üzerinde epey dokümantasyon var. C veya C++'ın aksine, Rust'ta bir tamsayı değerini enum değerine öylece atayamazsınız. Bir wrapper sınıfı oluşturup her seferinde cast ettirebilirsiniz ama o zaman kodun yarısı .into() olur ve sürücüye ek yük getirme ihtimali de yüksek.
Görünüşe göre buffer için void* dışında bu enum değerlerini ayarlamıyor ya da değiştirmiyorlar; sadece okuyorlar. NTSTATUS için bir match {} bloğu yeterli olur gibi. WDFREQUEST bir handle olduğu için, aynı tipte başka bir handle ile değiştirmek dışında yapabileceğiniz pek bir şey de yok.
Timer ve SpinLock, unsafe kütüphane çağrılarını içinde saran Rust tarzı nesnelere dönüştürülmüş. Bunun dışında, ciddi bir performans maliyeti olmadan bu kodu daha Rust'a özgü hale getirmenin yolu pek görünmüyor.
Daha iyisi ne olur biliyor musun? Aygıt sürücülerini C# gibi bellek yönetimli bir dilde yazmak.
Kernel'ı daha kolay erişilebilir hale getirmektense, kernel içinde üretici kodunu daha az çalıştırmanın en iyi yol olduğu yönündeki Microsoft kararına katılıyorum. C#, “bir buffera erişmek istiyorum ama henüz page-in edilmemiş ve ben bir interrupt handler içindeyim” gibi durumlara uygun değil; bu yüzden kernel'da garbage collector'ı hatasız çalıştırmak neredeyse imkânsız görünüyor.
Sürücüler, örneğin interrupt handler sırasında olduğu gibi page fault'un mümkün olmadığı anlarda belleğe erişebileceğinden, bellek kullanılabilirliğini çok sıkı kontrol etmek gerekir. C# dili ve runtime'ı en azından bunu açıkça ele alacak özellikler eklemeli.
Bence biraz küçümseniyor, o yüzden eklemek istiyorum. Russinovich, Windows çekirdeğiyle ilgili sayısız kaynak ve araç üretmiş bir kişidir. Windows çekirdeğiyle ilgili geliştiriciler arasında (rootkit geliştirenler dahil) Russinovich’in kaynaklarını ya da belgelerini inceleyerek çalışmamış neredeyse kimse yoktur diye düşünüyorum.
Windows çekirdeğinin Rust ile yeniden yazıldığına dair konuşmalar vardı; sonunda sürücü SDK'sı da çıkıyor demek. Yakında 20XX yılından itibaren sürücüleri Rust ile yapın diye bir duyuru gelebilir gibi görünüyor.