2010-03-02 13 views
2

arrière-plan: flash à 0x02000000/2M, SDRAM à 0x10000/16M, processeur: ks8695. Le Bootloader et OS sont gravés dans le flash, lors de la réinitialisation, OS est copié en SDRAM à l'adresse 0x10000, puis définir PC (compteur de programme) à 0x10000 (c'est-à-dire, exécuter le système d'exploitation). Comme le PC est réglé sur 0x10000 (puisque le processeur peut exécuter la première instruction de l'OS à ce stade), pourquoi est-il nécessaire de spécifier l'adresse absolue de la section de texte de l'OS (à travers le réglage -Ttext = 0x10000) en le liant? (quand je définis -Ttext à 0x0, le système d'exploitation ne fonctionnera pas correctement).pourquoi l'adresse doit-elle être spécifiée en cas de liaison statique?

Meilleures salutations,

wenlujon

+0

Vous devriez éditer votre question, et mettre vos réponses à l'intérieur de la question, afin qu'elle soit plus facile à lire. – shodanex

+0

votre réponse ci-dessous est une bonne, d'autres peuvent simplement se référer à elle. – wenlujon

Répondre

0

Votre PC est à 0x10000, vous devez donc le lier à 0x10000, car votre code effectue un adressage absolu.

Le chargeur de démarrage n'effectue aucune résolution de liaison ou de symbole, il ne fait que copier un blob binaire sur 0x10000, puis régler le PC sur 0x10000. Donc, votre code doit être prêt à fonctionner à 0x10000, c'est pourquoi vous devez spécifier cela dans l'éditeur de liens.

L'appel de fonction est généralement effectué à l'aide de l'adressage relatif PC, mais ce n'est pas nécessaire dans le cas où vous souhaitez avoir accès aux données. Supposons que vous avez une table T. Si vous êtes lié à 0x0, et votre table est à 0x1234. Vous pouvez avoir des instructions qui se réfèrent à cette adresse.

Maintenant vous déplacez votre code à 0x10000. Votre adresse de table est maintenant 0x11234, mais votre code ne l'a pas maintenant déplacé, donc il essaie de charger des données à 0x1234, où il n'y a rien, ou de la merde. Maintenant, lorsque vous liez votre code avec un décalage, l'ensemble d'instructions qui a été utilisé pour accéder à T est modifié en conséquence. C'est tout ce que le lien est pour, la résolution du symbole en adrresses!

1

Je pense que vous en quelque sorte répondu à votre propre question - la RAM dans votre système est situé à 0x10000. Les deux principales méthodes d'exécution du code sont le stockage et le téléchargement (SnD) et l'eXecute-in-place (XIP). Il semble que vous stockez le code en flash et le copiez en RAM. Toutes les adresses de votre binaire doivent donc être décalées avec l'adresse de démarrage de la RAM, sinon elles seront erronées dans le binaire. Si votre flash est en mode NOR, vous pouvez le laisser en mode NOR et le code en place (XIP), mais il peut ne pas convenir à votre plate-forme.

Cela aide-t-il?

0

oui, l'adressage absolu est une bonne raison, mais qu'en est-il de la première instruction? Cela ne devrait rien avoir à voir avec l'adressage absolu.

étant donné que la première instruction du système d'exploitation est 0xe1a00000, l'instruction au décalage 0x10000 du système d'exploitation est 0xe3a01303. si -Ttext est mis à 0x0, en regardant dans le fichier carte, nous obtenons 0xe1a00000 à l'adresse 0x0, 0xe3a01303 à l'adresse 0x10000 (CPU dans la carte cible ne sait toujours pas du tout!). Lorsque le bootloader copie le système d'exploitation à l'adresse 0x10000, il copie 0xe1a00000 à 0x10000 et 0xe3a01303 à 0x20000 (ils ne sont rien d'autre que des données), ai-je raison? puis définissez PC sur 0x10000, l'UC doit exécuter 0xe1a00000 car l'instruction occupe l'adresse 0x10000, mais l'UC exécute en réalité 0xe3a01303 qui se trouve à l'adresse 0x20000.

  1. depuis 0xe1a00000 est à 0x10000 de la SDRAM, lorsque PC est réglé sur 0x10000, pourquoi CPU ne excelle pas 0xe1a00000?
  2. Comment est-ce que le CPU sait 0xe3a01303 est affecté à 0x10000 puisque ce travail est effectué par l'éditeur de liens dans mon ordinateur personnel?
+0

Ce n'est pas ce que vous avez décrit dans votre premier message. Sans plus de documentation sur votre bootloader, il est difficile de dire ce qui se passe. Peut-être il ya un "remappage" des options, qui modifie la carte mémoire ARM – shodanex

+0

s'il vous plaît notez-moi la différence entre ce poste et le premier. et que voulez-vous dire par "remapper"? est-il possible de provoquer le comportement étrange mentionné ci-dessus? Merci. – wenlujon

+0

la réponse est 1. Le processeur exécute 0xe1a00000; 2. GDB pense qu'il exécute 0xe3a01303, ce qui est faux car -Ttext est défini sur 0x0 autre que 0x10000 (qui est pris en charge). – wenlujon