2010-03-05 9 views
3

Je fais un éboueur pour développer une appréciation de leur fonctionnement.Comment puis-je obtenir les limites supérieures et inférieures de la zone de données globale dans C?

Je peux traiter les registres ainsi que la pile et la mémoire de pile pour trouver des références potentielles aux blocs alloués.

Mais le traitement de la mémoire de données globale m'a échappé.

Existe-t-il un moyen d'obtenir les limites supérieures et inférieures de l'espace mémoire global en C (j'utilise GCC sur Intel OS-X si cela peut aider)?

Quels autres domaines de mémoire ai-je pu manquer?

Répondre

4

Je ne peux pas vous donner une réponse directe ici, mais je peux vous dire que le Boehm/Demers/Weiser conservative garbage collector aura du code (et probablement des docs) pour vous montrer. Ce sera très dépendant de la plateforme, cependant.

+0

Merci. C'est une tâche complexe d'après ce que je comprends des fichiers gcconfig.h et os_dep.c. – philcolbourn

+0

C'est pourquoi je ne pourrais pas vous répondre directement. Trouver votre ensemble racine quand vous ne contrôlez pas le compilateur et/ou le code généré est une tâche non triviale. –

1

Si je comprends bien, vous voulez savoir si le pointeur p pointe vers la zone de données globales du programme.

La solution va dépendre de la plate-forme, les données initialisées nulles et les données initialisées statiquement sont probablement à des endroits différents. Il n'y a rien dans C qui spécifie que ces zones doivent exister à tous, encore moins qu'elles sont contiguës ou ne pas être dans la même gamme que le tas ou même entre les fonctions.

Vous souhaitez avoir un symbole global au début et un à la fin et utiliser leur référence pour vérifier les plages. Pour ce faire, vous devez comprendre l'éditeur de liens.

Avant cela, vérifiez que la bibliothèque C n'exporte pas déjà de telles données, même si elles ne sont destinées qu'à la consommation interne.

+0

Fermer. Je veux analyser la zone de données globale pour les pointeurs vers le tas. Mais je pense que vous avez couvert le problème. Merci. ttmrichter m'a indiqué un GC populaire (il semble) qui a des pages et des pages de code pour faire ce que je veux - bien qu'ils supportent un grand nombre de plates-formes. – philcolbourn