c - 用于编写虚拟机软CPU的分区内存

标签 c memory cpu-registers

我正在尝试用 C 语言编写一个简单的软 CPU,它将在嵌入式应用程序的虚拟机器上运行。我对此很陌生,所以请耐心等待。

我一直在尝试在 IDE 中执行此操作,但遇到了一个问题,我需要 malloc 内存,但没有获得一致的内存地址来分配我的寄存器,因此我无法运行测试和调试。在实际的硬件上,我知道文档会给我特定寄存器、主内存和硬盘内存的地址,对吗?我希望能够为我的寄存器定义宏,然后我可以将其传递给读/写,但是如果没有静态内存地址,这似乎是不可能的。

所以看来我需要一种好方法来使用静态地址分配静态内存块,无论是在 IDE 中还是在我自己的带有文本编辑器的机器上。最好的方法是什么?作为引用,我正在使用 Cloud9 IDE,但不知道如何在这个平台上执行此操作。

谢谢!

最佳答案

您应该执行类似 uint8_t* const address_space = calloc( memory_size, sizeof(uint8_t) ); 的操作,当然检查返回值,然后将所有机器地址索引放入数组中,就像address_space[dest] = register[src];。如果您的模拟 CPU 可以处理不同大小的数据,或者比主机 CPU 的对齐限制不太严格,则需要使用 memcpy() 或指针转换来传输数据。

无论address_space是静态分配还是动态分配,您的调试器都会理解诸如address_space[i]之类的表达式,但如果您事先知道确切的大小,则可以静态分配它,例如,模拟具有 16 位地址且始终具有 65,536 字节 RAM 的机器。

关于c - 用于编写虚拟机软CPU的分区内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44207747/

相关文章:

c - 我怎样才能看到从 child 那里收到的信号名称?

c - 如何找到某种类型的所有赋值表达式

c - 树的意外预序遍历

c++ - C/C++内存分配分块

c++ - 如何在 C++ 中释放静态成员变量?

assembly - NASM - 如何将 8 位寄存器移动到完整的 32 位寄存器?

c - 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

assembly - 使用 intel x86-64 指令从 YMM 寄存器到 RAX 的 MOV

assembly - 为什么 Assembly x86_64 系统调用参数不像 i386 那样按字母顺序排列

python - 运行后memmap文件在哪里?