我正在尝试分析和理解运行 linux 的嵌入式系统。
我对 linux 引导过程、嵌入式 linux 等还很陌生,所以我必须学习很多东西,但更喜欢边做边学。所以分析一个系统是我试图理解这一切的方式。通过查看 bootmsg、检查一些脚本和提供的文件(固件)并尝试通过在这里和网络中的其他地方搜索答案来尝试了解发生了什么,我已经获得了一些见解并学到了很多东西。这也可能是我可能会使用一些错误表达的原因,我希望你能理解。Atm 我无法直接询问这个系统的创建者,所以我希望你能在这里帮助我一些答案。
所以系统得到了一个 SOC(Marvell Armada-370 88F6707-A1)和一些闪存(128 MiB - Hynix NAND(HY27U1G8F2BTR))和 DRAM(512 MB),并且似乎从 SPI 闪存(1MB)加载引导加载 U-Boot。
如上所述,因为U-Boot用作引导加载程序,然后加载一些Linux version 3.2.34.
我想我在这里已经了解了相当多的一般引导过程,但是根据提供的bootargs
.
以下是printenv
命令的摘录(U-Boot 环境)
image_name=uImage
mtdids=nand0=nand0
mtdparts=mtdparts=nand0:8m(kernel),6m(Initrd),-(rootfs)
select0=nand info
load0=nand read.e 0x02000000 0 360000
loadr0=nand read.e 0x04000000 800000 300000
boot=bootm 0x02000000 0x4000000
bootcmd=run beep select0 load0 loadr0 boot || run beep beep beep errled
bootargs=console=ttyS0,115200 root=ubi0:rootfs ubi.mtd=3,2048 initrd=0x12000000 rootfstype=ubifs
beep=beep
我看到他们将内核和压缩的 ramdisk 内容加载到 ramload0=nand read.e 0x02000000 0 360000
和loadr0=nand read.e 0x04000000 800000 300000
. 内核在启动时查看0x04000000
ramdisk_image 并解压缩以使用初始 rootfs 的内容。然后通常的过程以linuxrc
/init
开始……最后,按照内核命令行 ( ) 中的说明加载来自 nand 的正常文件系统(这里是 ubi 设备 0 的 rootfs 分区root=ubi0:rootfs ubi.mtd=3,2048 rootfstype=ubifs
)。这就是我所理解的这里正在发生的事情,并且可能非常简单。
我现在想知道的是以下bootargs
部分initrd=0x12000000
。当我们已经让内核知道压缩 ramdisk 的真实性(作为 的第二个参数)时,我不太明白为什么它们在这里提供不同的地址bootm
。我使用和不使用此参数启动系统,似乎没有区别。
正如我对阅读该initrd=
参数的理解一样,它似乎与已经传递给的第二个参数做同样的事情bootm
,它告诉内核在哪里可以找到initrd
加载初始的rootfs
.
谁能解释为什么我们在这里将两个不同的位置传递给内核的initrd?这只是一些被忘记删除的过时东西还是有原因的?
在此先感谢您的帮助。我希望我没有错过任何东西,而且问题还没有在这里得到回答,但我找不到任何东西。
编辑2:
感谢评论中的@sawdust,我更好地理解了这里实际发生的事情,并看到了向问题添加更多信息的重要性,以便更清楚地理解答案。
这里是一个简短的摘录bootmsg
> bootm 0x02000000 0x4000000
## Booting kernel from Legacy Image at 02000000 ...
Image Name: Linux-3.2.34
Created: 2013-08-15 4:18:54 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3464064 Bytes = 3.3 MB
Load Address: 00008000
Entry Point: 00008000
Verifying Checksum ... OK
## Loading init Ramdisk from Legacy Image at 04000000 ...
Image Name:
Created: 2013-09-10 10:38:37 UTC
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 3030739 Bytes = 2.9 MB
Load Address: 12000000
Entry Point: 12000000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
我也总是错过这部分的一些信息,这bootm
可能已经暗示了这里发生的事情。并且可能与相同地址的存在相关应该导致答案的路径。
edit-1:添加了有关硬件的更多信息
edit-2:添加bootmsg
了更多信息