x86 与 ArmV6-M Boot/Reset 流程对比

Comparison of x86 and ArmV6-M Boot/Reset Process

看着 ARMv6-M Technical Reference Manual reset/startup 进程已定义。简单地说,它从 0x00000000 加载 SP,从 0x00000004.

加载 PC

对于 x86,我正在尝试查找类似的信息。从一般的 Google 搜索中,我可以简单地看到 CPU 首先加载 BIOS,然后加载引导设备并将执行传递给它,如果最后两个字节是 0x550xAA。我有很多与此过程相关的问题:

  1. 我假设 x86 的重置向量 CPU 将指向 BIOS 代码?
  2. x86 CPU 的复位向量地址记录在哪里?我似乎无法找到它 Combined Volume Set of Intel® 64 and IA-32 Architectures Software Developer’s Manuals.
  3. 当我Google搜索x86引导程序时,为什么包含BIOS而不是像ArmV6M中那样简单地给出复位向量地址?我知道这很愚蠢,但我不能在理论上使用 x86 CPU 创建一个微控制器并且没有 BIOS,然后像典型的 ArmV6M 微控制器一样从 ROM 中的代码开始执行吗?因此,BIOS 不是与 x86 分开的,只是为一些旨在收集连接的硬件信息的代码提供的名称吗?即 Armv6M 系统不能也有 BIOS 吗?因此,像 BIOS/UEFI 和 MBR/GPT 这样的技术不是与 x86 没有内在关系,而是经常与 x86 一起出现以促进许多 x86 计算机的通用性质吗? (所以 0xAA55 是 x86 BIOS 特有的?)

处理器就是处理器,架构由不同的人设计,因此没有理由假设任何两个处理器都以相同的方式工作。

请注意,您正在查看比方说非正常 ARM 启动。 cortex-m 使用(传统的)向量 table。全尺寸 ARM,ARMv1 到 ARMv6 或 7-A 使用 table 指令,而不是地址。然后 ARMv8(cortex-a not m)有自己的方案(这是 64 位 ARM 之前的全新设计)。然后是您发现的 cortex-ms,armv6m-8m。

如果回到开头,Intel(搜索 iapx 88 书籍)清楚地记录了 CS 设置为 FFFFh 和指令指针 0000h。它开始在那里执行代码(有点像全尺寸的 ARM)。然后从后面有一个中断向量 table(我发现有人从 Intel 的 bitsavers 标记了数字版本令人不安,向量是正确的术语 and/or 不会混淆也不需要替换)我认为从地址零开始。现在显然 arm 和 x86 都有一个(或两个,也许三个)硬件中断到 core/chip 并不能扩展到今天,所以其他解决方案已经发展(好吧,更多的中断)。

如果您考虑这两种架构或任何架构(msp430 类似于 x86,在内存顶部附近有一个向量 table space),您理想情况下需要一些非易失性内存( rom/flash) 和一些 ram(sram/dram 通常需要一些 sram 到 运行 代码来初始化 dram 控制器)。根据体系结构的规则,board/chip 设计人员需要配置地址解码器以将某些地址 space 指向非易失性地址,而另一些指向 ram。并且非易失性必须至少覆盖 chip/core 引导的位置。

在 arm 的情况下,芯片设计者可以在限制范围内捆绑不同的地址,我认为在一些具有单一捆绑带的旧款上,您可以选择高或低起始地址(0x00000000 和 0xFFFF0000 或类似的东西,您可以轻松查找)。 cortex-ms 规则更加严格。一些体系结构将 interrupt/exception 解决方案与重置放在 rom 地址 space 中,而另一些体系结构将其放置得足够远以暗示它应该在 ram 中。 MCU 通常希望在 rom space 中使用它,但在 ram 中的通用目的是在某个地方,因为操作系统将希望选择中断去向 运行time 作为驱动程序加载的时间,与裸机 mcu 解决方案相比你希望它在编译时全部解决。

请注意,您可能需要查看所有 Intel 文档,在 486 时代左右,他们将硬件和软件开发人员手册分开,上面的文档在合并手册时又回来了。

为什么我们没有 pre-bios 的详细信息?或者至少不要谈论它们。不管是好是坏,IBM、英特尔和微软让我们走上了这条道路,主要是英特尔。 PC 克隆的东西至今仍然存在,几十年后,我们仍然看到 BIOS 的许多残余以及插入卡与 bios/boot 一起添加东西的方法等等。你当然可以购买 x86 处理器并尝试在不使用库存 bios 的情况下制作自己的主板,然后只需编写自己的复位代码启动即可。

但是对于今天的 x86 芯片,幸运的是有一些部落知识,这使得从硬件和软件的角度来看都非常困难。几十年来,只有少数 BIOS 供应商也这样做了。你决定要进入主板业务(非常糟糕的主意),你基本上必须支付他们要求的任何价格,假设你能找到一个可以设计 pcb 并让它实际工作的人。

我们所说的 BIOS(名称使用不当,但无论如何,这就是我们所说的)在 flash/rom 上并且是处理器启动的代码 运行ning,它的作者知道这些细节(或者他们知道并且他们只是在知道 retired/died 的人之后很久才重用该代码)。根据该 PC 设计的主板和插卡解决方案的组合,用于在硬件供应商隐藏详细信息的情况下进行通用 BIOS/EFI 调用集(请阅读存储介质的第一个扇区,请不要让我必须有 dozens/thousands 不同解决方案的代码。在屏幕缓冲区上打印一些文本字符,请不要让我知道如何在每个可能的视频卡上写入像素)至少让你通过一些众所周知的和进化的引导过程可以让你进入你的操作系统,如果不是一直进入你的操作系统,那么今天的内核驱动程序会检测并确实为每个(支持的)different/incompatible 硬件外围设备提供代码。

环顾四周,你会看到无数人试图以操作系统或引导加载程序使用 bios/efi 调用的方式启动 x86,在某些媒体上已知 address/offset 等。但是如何 flash/rom代码工程是另外一回事了。它肯定是有记录的。毕竟这是英特尔(即使是 AMD),现在如果这是一份 NDA 文件,或者只是一份很少下载以至于很难找到的文件。但它被记录在案。您可能会在虚拟 machine/simulator 中找到信息,但我想知道它们是否有 bios 或仅够启动流行的操作系统 and/or 他们作弊。

根据历史的发展情况,我假设有一个高位地址,如果不是在地址的 msbits 中有很多,那么当前的 x86 处理器会进行第一次提取,然后它就起来了供电路板设计师和软件人员使用。

归根结底,所有处理器都必须有第一个获取地址的解决方案,最好是 interrupt/exception 解决方案。硬件人员必须设置他们的解码器来处理第一个获取地址,并为软件开发人员提供一种将第一条指令放入该路径的方法。除非您为目标受众记录下来,否则您不会卖出很多筹码。现在对于 MCU,理想的目标受众是 tens/hundreds 个人客户中的 thousands/millions 个。对于现代 x86,这个列表相对较小,软件只有少数人,硬件有成百上千的客户。 x86 和 pc 标准,如果你真的是要走的路,苹果有点偏离,但很可能在不久的将来他们将停止使用 x86 并坚持使用他们的新解决方案,将 x86 留给 pc 模型。

  1. 是的,我们称之为 BIOS(具有 OS 类似功能的奇特引导加载程序)确实具有引导处理器的代码,包含第一个获取的闪存说明。

  2. 继续看。所以这对我来说不是 google 网站。

  3. 当然可以。任何(通用)处理器都可以有一个引导加载程序,该引导加载程序提供抽象的低级服务以隐藏细节并提供通用接口。但是例如 armv6m 很可能会在 MCU 中找到,它不需要支持无限数量的不兼容插件产品(在 usb 之外,这是它自己的噩梦),该核心的目标市场,and/or 你通常会发现它的地方,它是在外围设备已知且资源稀缺的 MCU 中,理想情况下你不会处理膨胀层,尽管人们今天出于某种原因正在这样做你甚至不想要一个(RT )OS,只是专门针对该芯片的旧裸机硬编码软件。

    我们知道 Apple(他们不是第一个)有一个带有非 x86 的“PC”,它至少支持一小部分外围设备(视频 chips/cards 等),但是这是 Apple 列表很短,不是单一的,而是很短的(每个外围设备类型)。所以它已经完成了,但是像 PCIe 这样的东西被创建了 by/for 基于 x86 的 pc,并且仍然有一些 pc-isms 在那里你可能需要处理(none 我工作的卡但是例如,我不知道今天的 BIOS 是如何与视频卡一起工作的,我认为它只是从第一台 PC 解决方案慢慢演变而来。

如果你真的觉得有必要,你最好买一些旧的 8086 或 80186 零件然后把它们弄乱。如果您想购买当前的 x86 芯片,祝您好运。通过观察硬件人员的做法,我会推荐 AMD 而不是 Intel,你会有更好的机会。但是,AMD 会作为一个没有大牌客户的个人与您交谈,并且没有足够大的芯片年消费量吗?我不知道。

技术上是否可以购买任何一代的 x86 处理器并将其放在板上并编写您自己的代码而不使用别人的 BIOS,而不使用您自己的 BIOS,绝对地。从技术上讲,每个 x86 板都是处理器 flash/rom,并且首先在 flash/rom 上获取指令。在那个级别,根据定义,它是裸机代码,就像你 see/write 在单片机上一样。