我试图了解 linux 在 arm 架构上启动的细节。我在互联网上进行了大量搜索,到目前为止了解了一些细节,尽管我觉得每次阅读一篇文章都会带来很多其他新术语,这让事情变得更加复杂。我确实有 2 个运行 linux 的板,一个 olimex 9261 和一个 beaglebone black。我在嵌入式系统尤其是 arm 方面的专业知识非常好,但在 linux 上玩的并不多(除了一些用户空间程序和内核中的 char 驱动程序)。
以下是我的问题:
一块一块板我有以下uboot输出(linux 2.6.30):
bootargs=mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2
bootcmd= cp.b 0xC0042000 0x22000000 0x00199954; bootm 0x22000000
该板有 64MB RAM(映射在 0x20000000)、512MB nand flash(目前没有找到映射)和 2MB 数据闪存(映射在 0xc0000000)。
我在这里不明白的是:
- 为什么 bootargs 中有 mem=64?这不应该作为 ATAG 或 DTB 给出吗?
- 当我们将控制权传递给内核时,为什么会有一个控制台作为参数?使用 tty 的内核是否已经由 uboot 配置?
- initrd 与 rootfs。这对我来说仍然不清楚。我知道 initrd 可以作为块设备或单独的映像包含在内核中,uboot 必须将地址详细信息传递给内核(真的吗?)。我们能否拥有一个不包含 initrd 的内核 + 另一个文件系统,如 jffs2,内核将从该文件系统运行其余驱动程序?实际上我无法理解内核在启动时使用的文件系统的全部细节。在我的这个设置中,有 4 个文件:uImage、bootstrap、env.bin 和 jffs2 文件系统。所以没有initrd。这是如何工作的?以及上述 bootargs 中指向的文件系统的 root 过程如何?在我的理解中,内核应该首先访问 jffs2 文件系统,然后抓取 /dev/mtdblock1 中的映像并挂载它。也许我的理解是错误的。实际上内核和文件系统之间的这种交互是我似乎不理解的。在上面的 bootcmd 中,内核从 nand 复制到 sdram,然后 bootm 跳转到它。但是内核如何在引导时找到 jffs 呢?我在引导期间看到此输出行:VFS: Mounted root (jffs2 filesystem) on device 31:1。
在董事会用户指南中,我发现了这一点:
警告:由于 AT91SAM9261 芯片勘误表不支持从 NAND 闪存引导。
...
512MB NAND 闪存(在 Linux 中被视为硅驱动器)。
- 编译内核后,我观察到 System.map 没有所有符号。我检查了vmlinux,它是一样的。有谁知道为什么?也许编译器没有正确配置?
非常感谢,丹尼尔。