我有一个带有 SPI 连接闪存的嵌入式设备。基本上,这意味着设备从一小块闪存启动其引导加载程序和 Linux 内核。
当设备启动时,但在挂载根文件系统并调用 switch_root 之前 - 我想选择性地启动第二个不同的内核
这可能吗?我的目标是在闪存中安装一个非常小的引导加载程序和库存内核 - 然后把更新/更大的内核放在硬盘上。
我的引导程序非常有限,我无法从硬盘读取较新的内核。
简而言之
a) CPU comes out of reset, reads its bootloader from flash
b) bootloader boots, inits basic hardware, loads Linux kernel from flash
c) kernel boots, inits more hardware, and reads a second kernel from a hard disk
d) I'd like to switch to the second kernel at this point
我在此过程中的目标是提供一种机制,让闪存中的内核可以随着时间的推移而变旧,但可以通过硬盘提供更新的内核。如果我的引导加载程序更先进,我会走这条路 - 但是它无法初始化必要的硬件(磁盘控制器),也没有现代文件系统支持
...我考虑过的一个选择是,是否可以将第二个内核放入物理内存中,将已知地址标记为具有第二个内核,然后重置。然后,引导加载程序可以检测已知地址并验证第二个内核的完整性,选择它而不是来自闪存的内核
任何建议都将不胜感激!
答案1
你不必做任何太复杂的事情。只需调用kexec
即可启动到新内核。它不可能变得更简单...除非你的旧内核以某种方式编译而没有 kexec 支持。
答案2
看看 UBOOT,这在过去对我很有用。
您甚至可以使用它来读取文件系统,但应该允许您在多个映像之间切换。这样,您总是会覆盖当前未使用的映像,并重新配置 uboot 以在重置时启动升级。