Question:
Suivi du message passant au lieu d'une pile d'appels
Daniel W. Steinbrook
2013-03-22 07:12:30 UTC
view on stackexchange narkive permalink

Dans un micro-noyau, une grande partie des fonctionnalités intéressantes ne se produit pas avec les appels de fonction traditionnels, mais plutôt par le passage de messages entre des entités séparées.

Existe-t-il une structure que les architectures de système d'exploitation comme celle-ci utilisent généralement pour implémenter le passage de messages ? Et y a-t-il un moyen méthodique d'étiqueter cela lors du démontage, pour qu'il soit aussi facile de suivre les chemins des messages que de suivre la pile d'appels?

Un répondre:
#1
+9
Igor Skochinsky
2013-03-22 23:52:19 UTC
view on stackexchange narkive permalink

Je ne pense pas avoir démonté de micro-noyaux, mais le "passage de message" est courant dans au moins deux catégories de programmes: l'interface graphique Win32 (à la fois Win32 brute et basée sur MFC) et les exécutables Objective-C.

Dans les deux cas, vous avez une sorte de routine de répartiteur (ou de routines) centrale qui accepte les messages et les transfère à certains destinataires , qui peuvent être à l'intérieur ou à l'extérieur du programme actuel.

Les destinataires peuvent être enregistrés dynamiquement ( RegisterClass dans Win32) ou peuvent être spécifiés de manière statique (métadonnées de classe Objective-C ou tables de gestionnaire de messages de MFC).

En ce qui concerne les répartiteurs, considérons le SendMessage de Win32. Il a des arguments hWnd et Msg (et des paramètres supplémentaires). Le premier spécifie le destinataire. Vous pourrez peut-être retracer d'où il vient, puis rechercher simplement l'enregistrement de classe correspondant à la fenêtre et vérifier si sa procédure de fenêtre gère ce message spécifique. Je suppose que vous pouvez marquer l'appel avec un commentaire "va à la procédure de fenêtre 0x35345800" ou similaire pour en garder une trace. Avec MFC, vous devrez trouver la table des messages de la classe et rechercher le gestionnaire correspondant.

Avec Objective-C, objc_msgSend accepte l'objet récepteur et le sélecteur pour effectuer. Si vous pouvez retracer l'objet, vous pouvez vérifier s'il a le sélecteur avec ce nom. Ou bien, vérifiez tous les sélecteurs portant ce nom dans le programme. Encore une fois, une fois que vous l'avez trouvé, faites un commentaire.

Donc, une approche similaire peut probablement être étendue à tous les autres systèmes de transmission de messages - trouver des destinataires, puis à l'endroit de l'appel du répartiteur, vérifier lesquels peuvent potentiellement le gérer et vérifier les gestionnaires. Parfois, vous n'avez même pas besoin de faire la première partie - si l'ID / le nom du message est suffisamment unique, vous pourrez peut-être trouver le gestionnaire simplement en le recherchant.

Un problème quelque peu lié est le travail avec C ++ et les fonctions virtuelles, mais il a été traité dans une autre question.


Je viens de me souvenir d'un autre type de programmes qui n'utilisent pas la pile d'appels. Ce sont ceux qui utilisent le style de passage de continuation, généralement écrit dans une sorte de langage fonctionnel. Greg Sinclair a écrit un article très agréable et divertissant sur les horreurs du démontage de CHICKEN - une implémentation du système de langage. Son site est en panne mais, heureusement, Archive.org en a gardé une copie. Une citation:

Pour un ingénieur inversé, Continuation Passing Style signifie la fin de la civilisation telle que nous la connaissons.

Tous les types d'IPC sur différents systèmes d'exploitation utilisent également une méthode similaire. Par exemple. RPC et LPC sous Windows. Heck, les IRP en mode noyau Windows ne pourraient-ils pas également être classés ici?
En effet, les IRP sont une autre possibilité!


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...