Soru:
Çağrı yığını yerine geçen mesajı izleme
Daniel W. Steinbrook
2013-03-22 07:12:30 UTC
view on stackexchange narkive permalink

Bir mikro çekirdekte, ilginç işlevlerin çoğu geleneksel işlev çağrılarında değil, ayrı varlıklar arasında mesaj geçişi yoluyla gerçekleşir.

Bunun gibi işletim sistemi mimarilerinin genellikle mesaj geçişini uygulamak için kullandığı bir yapı var mı? ? Ve bunu sökerken etiketlemenin, mesaj yollarını takip etmeyi çağrı yığınını takip etmek kadar kolaylaştırmanın metodik bir yolu var mı?

Bir cevap:
#1
+9
Igor Skochinsky
2013-03-22 23:52:19 UTC
view on stackexchange narkive permalink

Herhangi bir mikro çekirdeği parçalarına ayırdığımı sanmıyorum, ancak "mesaj geçişi" en az iki program kategorisinde yaygındır: Win32 GUI (hem ham Win32 hem de MFC tabanlı) ve Objective-C yürütülebilir dosyaları.

Her iki durumda da, iletileri kabul eden ve bunları bazı alıcılara ileten bir tür merkezi dağıtıcı yordamınız (veya yordamlarınız) vardır;

Alıcılar dinamik olarak kaydedilebilir (Win32'de RegisterClass ) veya bazı statik tarzda (Objective-C sınıfı meta verileri veya MFC'nin ileti işleyici tabloları) belirtilebilir.

Sevk görevlilerine gelince, Win32'nin SendMessage özelliğini ele alalım. hWnd ve Msg bağımsız değişkenlerine (ve ekstra parametrelere) sahiptir. İlki alıcıyı belirtir. Nereden geldiğini takip edebilir ve ardından pencereye karşılık gelen sınıf kaydını arayabilir ve pencere prosedürünün bu belirli mesajı işleyip işlemediğini kontrol edebilirsiniz. Aramayı takip etmek için "0x35345800 pencere prosedürüne gider" veya benzeri bir yorumla işaretleyebilirsiniz. MFC ile sınıfın mesaj tablosunu bulmanız ve karşılık gelen işleyiciye bakmanız gerekir.

Objective-C ile objc_msgSend , alıcı nesneyi ve seçiciyi kabul eder gerçekleştirmek için. Nesneyi geri izleyebiliyorsanız, bu ada sahip seçiciye sahip olup olmadığını kontrol edebilirsiniz. Veya alternatif olarak, programda bu ada sahip tüm seçicileri kontrol edin. Yine, bulduğunuzda bir yorum yapın.

Dolayısıyla, benzer bir yaklaşım muhtemelen diğer tüm mesaj iletme sistemlerine de genişletilebilir - alıcıları bulun, sonra sevk görevlisi çağrısının yerinde hangilerinin yapabileceğini kontrol edin potansiyel olarak ele alın ve işleyicileri kontrol edin. Bazen ilk bölümü gerçekten yapmanıza bile gerek kalmaz - mesaj kimliği / adı yeterince benzersizse, işleyiciyi yalnızca arayarak bulabilirsiniz.

Biraz alakalı bir sorun C ++ ve sanal işlevlerle çalışmaktır, ancak bu başka bir soruda ele alınmıştır.


Bir tür program daha hatırladım çağrı yığınını kullanmayan. Genellikle bir tür işlevsel dilde yazılmış Devam Eden Stili kullananlardır. Greg Sinclair, TAVUK'u parçalarına ayırmanın dehşetiyle ilgili çok hoş ve eğlenceli bir makale yazdı - dil Şemasının bir uygulaması. Onun sitesi çalışmıyor ama neyse ki Archive.org bir kopyasını sakladı. Ondan bir alıntı:

Tersine mühendis için Devam Eden Geçiş Stili bildiğimiz haliyle uygarlığın sonu demektir.

Çeşitli işletim sistemlerinde her tür IPC de benzer bir yöntem kullanır. Örneğin. Windows'ta RPC ve LPC. Heck, Windows çekirdek modundaki IRP'ler burada da kategorize edilemez mi?
Nitekim IRP'ler başka bir olasılıktır!


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...