正如您所说,处理器内核通常具有某种表的起始地址,或者是地址列表,或者像 ARM 一样,是执行指令的地方。包裹在该核心周围但在芯片内部可能会有所不同。不特定于芯片供应商的内核,如 8051、mips、arm、xscale 等,将有更广泛的不同答案。例如,一些微控制器供应商会查看表带引脚,如果在释放复位时表带以某种方式连接,那么它将从芯片内的特殊引导闪存执行,例如,您可以使用引导加载程序来对用户引导闪存进行编程.如果表带没有以某种方式系好,那么有时它会启动您的用户代码。我知道的一个供应商仍然在引导他们的引导加载程序闪存,如果向量表具有有效的校验和,那么他们会跳转到向量表中的重置向量,否则他们会处于引导加载程序模式等待您与他们交谈。
当您使用更大的处理器、非微控制器时,软件位于处理器外部,或者位于启动闪存(与处理器分离的芯片)上,或者在重置之前以某种方式管理的某个 ram 等。这些通常遵循规则对于内核,从地址 0xFFFFFFF0 开始或从地址 0x00000000 开始,如果那里有垃圾,哦,好吧,关闭未定义的指令向量,如果那是垃圾,就挂在那里或坐在无限循环中调用未定义的指令向量。这适用于 ARM,例如,您可以构建一个带有从工厂擦除的引导闪存(所有 0xFF)的电路板,然后您可以使用 jtag 停止 arm 并第一次对闪存进行编程,您不必拆焊或套接字或预编程任何东西。只要您的引导加载程序不挂起您的手臂,您就可以拥有一个牢不可破的设计。 (实际上,您通常可以将 arm 保持在复位状态,并且仍然可以使用 jtag 调试器进行处理,而不必担心错误的代码会弄乱 jtag 引脚或挂起 arm 核心)。
简短的回答:有多少不同的处理器芯片供应商?有许多不同的解决方案,你能想到的都有,而且已经部署了更多。将重置处理程序地址放置在内存中的已知位置是最常见的。
编辑:
问题 2 和 3。如果您要购买芯片,一些微控制器具有此受保护的引导加载程序,但即使这样,您通常也会编写产品将使用的引导代码。该引导代码的一部分是初始化堆栈指针并准备内存并启动部分芯片和所有这些好东西。有时芯片供应商会提供示例。如果您购买的是板级产品,那么您通常会发现一个板级支持包 (BSP),其中包含工作示例代码来启动板级并可能做一些事情。比如说 beagleboard,或者 open-rd 或 embeddedarm.com 带有引导加载程序(u-boot 或其他),有些已经预装了 linux。像这样的板,用户通常只是编写一些 linux 应用程序/驱动程序并将它们添加到 bsp,但您不仅限于此,通常欢迎您完全重写和替换引导加载程序。编写引导加载程序的人必须设置堆栈并启动硬件等。
gameboy Advance 或 nds 之类的系统,供应商有一些启动代码调用您的启动代码。所以他们可能有堆栈和这样的设置,但他们正在交给你,系统的大部分可能已经启动,你只需决定如何分割记忆,你想要你的堆栈,数据,程序,等等
一些供应商希望对这些东西进行控制或保密,而其他供应商则不这样做。在某些情况下,您最终可能会得到一个没有示例代码的板或芯片,只有一些数据表和参考手册。
如果你想进入这个行业,虽然你需要准备好编写这个启动代码(在汇编程序中),它可能会调用一些 C 代码来启动系统的其余部分,那么这可能会启动主操作系统或应用程序或其他任何东西。 Microcotrollers 听起来就像您正在玩的东西,您的问题的答案在芯片供应商用户指南中,有些供应商比其他供应商更好。在文档中搜索“reset”或“boot”一词,尝试找出它们的启动方案是什么。我建议您使用“美元票”来选择更好的供应商。一个拥有糟糕文档、秘密文档、糟糕支持的供应商,不要给他们你的钱,把你的钱花在提供可免费下载、编写良好的文档、编写良好的示例和/或用户论坛的供应商上,而全职员工则在回答问题。有时文档不可用,除非是认真的付费客户,这取决于市场。尽管大多数通用嵌入式系统都是公开记录的。质量差异很大,但文档等都在那里。