我最近开始学习汇编,并开始了解链接器脚本和其他硬件编程的低级细节。我也在自学计算机体系结构,并且在某个地方,我开始担心我对内存模型的描述可能一直都是错误的。
根据我目前的了解,在我们将二进制文件“烧录”到处理器上之后,所有代码和数据都驻留在非易失性存储器上——易失性 RAM 在重置时不包含任何内容。当程序开始“执行”时,它从地址 0x0000 开始执行,该地址几乎总是(AFAIK)闪存中的最低地址。因此,指令被锁存到将 Flash 连接到 CPU 内核的总线上,这就是实际执行发生的地方。但是,当我们谈论 CPU 从内存中检索或存储数据时,我们通常会谈论 RAM——我知道我们也可以从程序内存中读取/写入数据(我在 AVR 上看到过这种情况)但它不是很常见吗?是因为 RAM 比 ROM 快,我们更喜欢在那里存储数据吗?
这个问题的公认答案是大多数代码都在 RAM 之外执行。
这是否意味着启动运行时代码(它本身从 Flash 执行)必须将所有程序操作码从 Flash 复制到 RAM,并以某种方式将 Flash 中的地址映射到 RAM,以便 CPU 从那里获取操作码?它是否类似于我们在启动时将 .data 部分从 ROM 移动到 RAM 的过程?
我可以想象这在程序和数据存储器共享总线的冯诺依曼体系结构中更简单,但在哈佛体系结构中,这是否意味着所有代码和数据都必须首先通过 CPU 寄存器?
正如您可能猜到的那样,我对整个业务感到有点困惑。一直在更高的抽象级别进行编程,我很容易被这些细节困扰。任何帮助表示赞赏。