2010-05-04 5 views
3

J'ai lu que l'allocation de mémoire statique est effectuée pendant la compilation.Attribution de mémoire statique et portabilité

L'adresse allouée est-elle utilisée lors de la génération d'exécutables?

Maintenant, je doute de la façon dont l'allocation de mémoire est gérée lorsque le code exécutable est transféré complètement sur un nouveau système.

Je l'ai cherché mais je n'ai pas eu de réponse sur internet.

+1

Vous savez que sur les ordinateurs modernes, chaque processus d'exécution voit un nouvel espace d'adresse indépendamment de ce que les autres processus ont fait? (et avant les MMU qui le permettent, il ne serait pas inhabituel de charger des exécutables toujours à la même adresse, bien que la mémoire virtuelle et la liaison soient techniquement deux concepts distincts qui ne doivent pas forcément aller ensemble). –

Répondre

3

Eh bien, cela dépend totalement des circonstances si votre exécutable peut être exécuté sur votre nouveau système ou non. Chaque système d'exploitation définit son propre format de fichier exectuable. Par exemple, here's comment ressemble Windows Exe. Il y a une raison pour laquelle ils sont appelés exécutable portable. Lorsque votre compilateur génère un tel exécutable, il compile d'abord votre code C vers l'assembly correspondant de votre architecture cible, puis le place dans le format de fichier exécutable cible. Les allocations de mémoire statiques trouvent leur place dans ce format.

Vous pouvez imaginer le fichier exe comme une sorte d'image mémoire chargée dans un nouvel espace mémoire par le chargeur de processus des systèmes d'exploitation. Le système d'exploitation maintient le décalage à cet emplacement et s'assure que tous les accès mémoire des programmes vont dans l'espace d'adressage protégé de son processus.

Pour répondre à votre question spécifique: Le transfert d'un exécutable entre des systèmes du même système d'exploitation et de l'architecture n'est généralement pas un problème. Le même scénario de système d'exploitation mais une architecture de machine différente peuvent généralement être manipulés par le système d'exploitation via l'émulation (par exemple, Rosetta de Mac OS émule PowerPC sur x86). La compatibilité 64/32 bits est également traitée de cette manière. Le transfert entre différents OS n'est généralement pas possible (pour les exécutables natifs) mais tout ce qui fonctionne à l'intérieur des machines virtuelles (java vm, .net CLR) ne pose aucun problème, car le chargeur charge uniquement la machine virtuelle et le programme réel est exécuté.

+0

Pouvez-vous expliquer le cas "même système d'exploitation mais architecture différente" ....? Quel est en réalité le mécanisme dans ce cas? –

+1

A: MacOS sur PowerPc (anciens macs) ou Intel (nouveaux Macs). Sur un nouvel intel mac, l'ancien code PowerPC peut être exécuté via l'émulation d'un CPU PowerPC. B: Windows sur x86 et x86-64 (32 bits/64 bits): Maintenez la compatibilité ascendante avec le code 32 bits en fournissant un espace d'adressage virtuel pouvant être adressé avec des pointeurs 32 bits. –

Questions connexes