2017-05-26 1 views
-1

J'essaye d'écrire un CPU simple en C qui fonctionnera sur une machine imaginaire pour une application embarquée. Je suis nouveau à cela, alors supportez-moi. J'ai essayé de faire ceci dans un IDE, mais j'ai rencontré un problème où j'ai besoin de mallocer la mémoire et je ne reçois pas une adresse mémoire cohérente pour l'allocation de mes registres, donc je suis incapable d'exécuter des tests et déboguer. Sur un matériel réel, je comprends que la documentation me donnerait les adresses de registres spécifiques, la mémoire principale, et la mémoire du disque dur, correct? J'aimerais pouvoir définir des macros pour mes registres que je peux ensuite passer en lecture/écriture, mais cela semble impossible sans adresses mémoire statiques.Mémoire partitionnée pour l'écriture d'un CPU logiciel de la machine virtuelle

Il semble donc que j'ai besoin d'un bon moyen d'allouer un morceau de mémoire statique avec des adresses statiques, que ce soit dans un IDE ou sur ma propre machine avec un éditeur de texte. Quelle serait la meilleure façon de faire cela? Pour référence, j'utilise Cloud9 IDE mais je n'arrive pas à comprendre comment le faire sur cette plateforme.

Merci!

+1

Vous pensez que c'est faux ... le code qui s'exécute sur votre CPU virtuelle peut nécessiter des adresses fixes pour les registres d'E/S et autres. Votre code est supposé traduire les adresses. Par exemple. pour la RAM, vous pouvez simplement les utiliser comme offset dans un morceau alloué avec 'malloc'. –

Répondre

1

Vous devriez faire quelque chose comme uint8_t* const address_space = calloc(memory_size, sizeof(uint8_t));, vérifier la valeur de retour bien sûr, et ensuite faire tous vos index d'adresses de machines dans le tableau, comme address_space[dest] = register[src];. Si votre CPU émulée peut gérer des données de tailles différentes ou a des restrictions d'alignement moins strictes que votre CPU hôte, vous devrez utiliser memcpy() ou des moulages de pointeur pour transférer des données.

Votre débogueur comprendra des expressions comme address_space[i] si address_space est allocation statique ou dynamique, mais vous pouvez allouer statiquement si vous connaissez la taille exacte à l'avance, par exemple pour émuler une machine avec des adresses 16 bits qui a toujours exactement 65536 octets de RAM.

+0

C'est parfait, je ne savais pas que je pouvais juste traiter un morceau de mémoire malloc'd comme un tableau. Merci! – Davigor