Pitanje:
Praćenje prijenosa poruke umjesto niza poziva
Daniel W. Steinbrook
2013-03-22 07:12:30 UTC
view on stackexchange narkive permalink

U mikro jezgri, većina zanimljive funkcionalnosti ne događa se s tradicionalnim pozivima funkcija, već kroz prosljeđivanje poruka između zasebnih entiteta.

Postoji li struktura koju OS arhitekture poput ove obično koriste za implementaciju prosljeđivanja poruka ? A postoji li metodičan način da se to označi tijekom rastavljanja, kako bi se olakšalo slijedenje putova poruka kao i slijed poziva?

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

Mislim da nisam rastavio nijednu mikrokernelu, ali "prosljeđivanje poruka" uobičajeno je u najmanje dvije kategorije programa: Win32 GUI (i neobrađeni Win32 i MFC) i izvršne datoteke Objective-C.

U oba slučaja imate neku vrstu središnje rutine za dispečere (ili rutine) koja prihvaća poruke i prosljeđuje ih nekim primateljima , koji mogu biti unutar ili izvan trenutni program.

Primatelji se mogu dinamički registrirati ( RegisterClass u Win32) ili mogu biti određeni na neki statičan način (metapodaci klase Objective-C ili MFC-ove tablice obrađivača poruka).

Što se tiče dispečera, razmotrimo Win32-ov SendMessage . Sadrži argumente hWnd i Msg (i dodatne parametre). Prva navodi primatelja. Možda ćete moći pronaći odakle je poteklo, a zatim samo potražite registraciju klase koja odgovara prozoru i provjerite obrađuje li njegov postupak prozora ovu specifičnu poruku. Pretpostavljam da biste poziv mogli označiti komentarom "ide na postupak prozora 0x35345800" ili slično da biste ga pratili. S MFC-om ćete morati pronaći tablicu poruka klase i potražiti odgovarajući rukovatelj.

S Objective-C, objc_msgSend prihvaća objekt koji prima i selektor izvesti. Ako možete pratiti objekt, možete provjeriti ima li selektor s tim imenom. Ili, pak, provjerite sve selektore s tim imenom u programu. Opet, kad ga pronađete, dajte komentar.

Dakle, sličan pristup vjerojatno se može proširiti na sve druge sustave za prosljeđivanje poruka - pronađite primatelje, a zatim na mjestu poziva dispečera provjerite koji mogu potencijalno to riješite i provjerite rukovatelje. Ponekad čak i ne trebate zapravo obaviti prvi dio - ako je ID / ime poruke dovoljno jedinstven, rukovatelj ćete možda moći pronaći samo pretraživanjem.

Pomalo povezan problem je rad sa C ++-om i virtualnim funkcijama, ali o njemu je riječ u drugom pitanju.


Upravo sam se sjetio još jedne vrste programa koji ne koriste niz poziva. Oni koji koriste Stil za dodavanje nastavka, obično napisani nekom vrstom funkcionalnog jezika. Greg Sinclair napisao je vrlo lijep i zabavan članak o strahotama rastavljanja PILETINE - provedbi jezične sheme. Njegova je web lokacija ugašena, ali srećom Archive.org zadržao je kopiju. Jedan citat iz njega:

Za obrnutog inženjera, Continuing Passing Style znači kraj civilizacije kakav poznajemo.

Sve vrste IPC-a na različitim OS-ima također koriste sličnu metodu. Npr. RPC i LPC na sustavu Windows. Dovraga, nisu li se i ovdje mogli kategorizirati IRP-ovi u načinu jezgre Windowsa?
Doista, IRP je druga mogućnost!


Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...