Question:
Comment puis-je déterminer la carte mémoire de l'appareil pour un système intégré?
Brendan Dolan-Gavitt
2013-06-03 22:03:08 UTC
view on stackexchange narkive permalink

Sur de nombreux systèmes embarqués, une grande partie de la communication avec les périphériques se fait par la lecture et l'écriture d'adresses d'E / S mappées en mémoire (MMIO) dans le logiciel. En supposant que j'ai accès à l'appareil physique et à une copie du micrologiciel que je peux charger dans IDA, comment puis-je savoir quels appareils se trouvent à quelles adresses?

Jusqu'à présent, je viens de faire devine en regardant le code, les références de chaîne (par exemple, si une fonction imprime "Initialisation de l'interruption de la minuterie", je peux deviner que certaines des adresses sont peut-être pour configurer une minuterie). Mais sûrement quelque chose doit savoir où tous les périphériques vivent en mémoire, car quelque chose est responsable du routage des lectures / écritures de la mémoire vers le bon périphérique.

Alors, y a-t-il un moyen plus systématique pour obtenir ces informations?

Un répondre:
Igor Skochinsky
2013-06-03 22:20:51 UTC
view on stackexchange narkive permalink

Mais il faut sûrement que quelque chose sache où tous les périphériques vivent en mémoire, car quelque chose est responsable du routage des lectures / écritures de mémoire vers le bon périphérique.

Dans les périphériques embarqués, il n'y a rien comme PCI (enfin, il peut être présent mais ce n'est qu'un des nombreux blocs HW). Vous ne pouvez donc pas simplement analyser toutes les possibilités pour découvrir les appareils existants. Le code doit savoir où tout se trouve.

Cela dit, il existe des sources d'informations que vous pouvez essayer de trouver.

  1. Fiches techniques - toujours le meilleur choix. Même s'il y a des fautes de frappe et des erreurs c&p, cela bat tout le reste. Notez que de nombreux fabricants ont des fiches techniques distinctes pour le brochage, les caractéristiques électriques / de température de puces spécifiques et des manuels d'utilisation (également appelés manuels de logiciel ou de programmation) qui sont partagés entre de nombreuses puces dans la même famille. Vous avez généralement besoin de ce dernier, bien que parfois le premier puisse également donner des conseils utiles.

  2. Tout code source (système d'exploitation, pilotes, etc.), vous pouvez rechercher le périphérique. Même si ce n'est pas pour le bloc matériel spécifique qui vous intéresse, les en-têtes peuvent inclure des définitions pour celui-ci.

  3. Si vous ne trouvez pas la correspondance exacte pour votre puce, recherchez quelque chose dans la même famille - souvent les différences ne sont que la taille de certains blocs ou le nombre de ports.

  4. Consultez la documentation pour les mêmes blocs matériels dans any puce de ce fabricant. Certains fabricants réutilisent leurs blocs IP dans les architectures - par exemple Infineon a utilisé à peu près les mêmes blocs GPIO dans ses bandes de base E-GOLD (C166) et S-GOLD (ARM). Renesas est un autre exemple - ils ont réutilisé des blocs IP de la série SuperH dans leurs puces ARM.

  5. Certains matériels sont normalisés dans toutes les architectures et fabricants, par exemple: PCI, contrôleurs USB (OHCI, EHCI, XHCI), contrôleurs hôtes SD, eMMC, etc.

EDIT : parfois, le matériel externe à la puce peut être connecté via une interface de bus externe (ou une interface de mémoire externe, ou bien d'autres des noms). Ceci est généralement présent dans les plus grosses puces avec au moins une centaine de broches. Cette interface peut être programmable et vous pouvez définir quelles plages d'adresses vont à quel jeu de broches. Souvent, il y a aussi des lignes dites chip select (CS) impliquées, qui permettent de multiplexer le même jeu de broches pour accéder à plusieurs appareils, de sorte qu'une plage d'adresses affirmera CS1, l'autre CS2 et ainsi de suite. sur. Si vous avez une telle configuration, vous devez trouver le code qui initialise l'interface externe ou vider sa configuration lors de l'exécution. Si vous ne pouvez pas faire cela, vous pouvez essayer de rechercher des accès mémoire qui correspondent à la disposition des registres de la puce externe (comme un contrôleur Ethernet), modulo une adresse de base dans l'espace d'adressage du CPU.

Bien, mais encore une fois, la connaissance doit également être intégrée dans le matériel. Par exemple. le logiciel lit à l'adresse physique 0xdeadbeef. Le matériel doit savoir que cela signifie "lire à partir du registre 0xf du contrôleur Broadcom Gigabit Ethernet". Ne devrait-il pas y avoir un moyen d'énumérer ces mappages (pas nécessairement dans le logiciel, mais par exemple en recherchant la connectivité sur la carte ou en vidant la configuration d'une puce de mappage d'adresse hypothétique)?
@BrendanDolan-Gavitt: a ajouté du texte sur ce que je pense que vous vouliez dire
Ok, je pense que je comprends. Malheureusement, le [SoC que je suis en train de regarder en ce moment] (http://i.imgur.com/oBe9mnD.jpg) a été fabriqué par PMC pour cette société spécifique (HP) et il n'y a pas de fiche technique ou de code source disponible; tout ce que je sais, c'est qu'il est basé sur un Cortex A8, mais cela ne me dit rien sur la carte mémoire. Donc, revenons à regarder le binaire je suppose ...


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...