old*_*mer 60
所有处理器都有一些特定于处理器的启动方式.通常在处理器地址空间中有一些地址,例如0xFFFF0000,处理器读取该内存.它找到的值用作代码的地址并开始在该地址执行代码.
芯片或电路板设计人员要做的硬件是确保将闪存或其他形式的非易失性存储器(ROM)映射到该地址空间,以便处理器的引导代码和该特殊引导代码的地址当电源打开并且复位被释放时,处理器将在那里读取地址(RAM是易失性的,关闭电源然后丢失数据,将其重新打开并获得一些随机数据,直到RAM是用其他东西写的.
因此,处理器运行的第一个代码通常称为引导加载程序,有些人可能会争辩说,单词加载器的后半部分意味着此代码既可以"引导"操作系统,也可以"运行"任何应用程序,也可以作为第二个代码.函数为开发人员提供"加载器"功能.如果您曾经使用过U-Boot甚至GRUB或许多其他引导加载程序,您可能会理解,如果您不接触任何内容,它将启动默认的任何内容,嵌入式应用程序或操作系统,无论如何.
但是如果你中断启动过程,并且中断该过程非常特定于平台和软件,有时你必须按下按钮或将两个引脚短接在一起,或者在串行/ UART端口上发送转义或其他字符,等等然后它进入加载器模式,您可以在其中更改它启动的内容和/或代替引导加载程序从Flash/ROM加载默认程序,它可能让您例如使用XMODEM或ZMODEM或以太网端口和将测试程序加载到RAM中的协议,然后让您运行该程序而不是默认程序.
有些人将启动软件称为引导加载程序,即使它不允许您中断进程并加载某些备用程序,因为启动代码可能会将应用程序从非易失性存储"加载"到RAM中.
并非所有引导加载程序都需要将应用程序从非易失性存储(闪存/ ROM,硬盘,CD-ROM等)复制到RAM.某些系统和某些应用程序从闪存/ ROM运行.以PC为例:PC中真正的引导程序是BIOS,它是一个存在于Flash/ROM中并从中运行的程序.对于系统DRAM就像一台PC,你要调出DRAM系统反正.配置硬件需要很多代码才能使DRAM工作,有时您可以在PC启动时在监视器上看到这种状态.如果您的系统中有SRAM,那么它可能还需要一些初始化,但通常不像DRAM那么复杂,并且通常可以立即启动并准备好使用很少或没有配置,不同的处理器和不同的系统是......不同的.
因此,处理器在处理器硬件中以某种方式硬编码处于复位状态.它找到了引导代码的入口点并开始执行该代码.然后,该代码通常需要启动并运行外围设备和RAM,然后运行主应用程序.或者至少在启动该应用程序之前需要多少硬件.
在嵌入式系统中加载Linux可以像升级RAM一样简单,并将内核从ROM复制到RAM,也许可以准备一些寄存器,也可能填充内核查看的一些内存位置,可能是内存大小和备用命令行例如,然后分支到内核的开头.您不必在某些系统上复制内核; 你可以分支到它所居住的ROM.然后Linux将启动系统的其余部分.在PC上,BIOS可以执行很多操作,例如调出视频,DRAM,枚举PCI(e)总线外设,调出硬盘或其他类似设备的文件系统,然后使用BIOS硬盘中的用户定义或像外围设备(USB拇指驱动器或CD-ROM等).文件系统的开头将包含某些如何根据BIOS代码的规则引导操作系统的方法.这可能是另一个引导加载程序(GRUB,U-Boot等),它最终将内核或操作系统启动代码复制到RAM然后分支到它...
术语引导加载程序和启动代码可以互换使用.有些人可能会对它们的不同或微妙差异感到挑剔,但它通常与复杂性有关,像U-Boot这样具有以太网驱动程序和文件系统驱动程序等的引导程序在某种程度上是其中的操作系统.自我,无论哪种方式U-Boot都非常复杂.
例如,微控制器的启动代码可能就像几行代码,设置堆栈指针和分支到main一样简单.启动代码/ bootloader可以是介于两者之间的任何级别的复杂性.如前所述,一些嵌入式系统从ROM启动并运行其应用程序,因此无需复制和运行.其他人需要复制并运行主应用程序.
有时硬件或其他方案会涉及到.例如,有许多基于FPGA的解决方案,其中硬件从ROM上读取内容并复制它.然后,当处理器或其他逻辑被释放时,您的程序或其他数据神奇地存在于RAM中,随时可以使用.即使电源关闭,它仍然存在于您通常不会触摸的ROM中.该树莓派有另一种解决方案.该芯片有两个处理器,一个是ARM,另一个是GPU,图形处理器,完全不同的指令集,专为数学运算而设计等.有某种形式,烧成芯片(很可能是芯片上的ROM)一个小的引导程序,足以启动和读取SD卡.这是GPU BTW; ARM处于重置状态.然后,GPU从SD卡读取其第一个引导加载程序文件,将其复制到RAM并运行它.
那个引导加载程序会做更多的事情,比如启动DRAM,然后将更复杂的第二个(第三个?)阶段引导加载程序从SD卡复制到DRAM然后运行它.该代码可能包含用于为系统执行屏幕/显示功能的GPU应用程序.此外,一旦视频和一切准备就绪,再次读取SD卡并将ARM应用程序从SD卡复制到DRAM,填写RAM中的一些项目(异常表中的引导向量(内核分支))以及Linux内核启动代码所需的已知位置的一些其他项目.然后它在ARM上释放重置.ARM在这一点上唤醒了它的应用程序,即内核,神奇地在RAM中......