uboot:将linux内核镜像加载到内存的几种常用方法

您所在的位置:网站首页 什么叫镜像文件呢 uboot:将linux内核镜像加载到内存的几种常用方法

uboot:将linux内核镜像加载到内存的几种常用方法

2024-07-10 17:28| 来源: 网络整理| 查看: 265

uboot的主要工作是初始化内存(DDR,DRAM)相关硬件,然后将linux内核镜像,设备树文件等加载到内存中,然后启动linux内核。它与PC机上的BIOS,单片机的bootloader类似,起到引导系统的作用。

本文来探讨一下如何做到上述到将linux内核镜像,设备树文件等加载到内存中。

首先,加载到内存的哪个地址?这是个问题,需要我们查相关手册,这里以stm32mp157为例子,官方要求将linux内核镜像加载到内存的C2000000地址,设备树也有相关限制,本文就以linux内核镜像uImage为例子

通常有两大类做法:

通过网络nfs,tftp服务将位于服务器上的linux内核和设备树文件加载到内存中

通过板载的flash(SD卡,EMMC)存储的linux内核和设备树文件加载到内存中

下面依次介绍这两种做法:

一.通过网络tftp服务加载:

通过网络加载,这里以tftp服务为例,将要加载的linux内核镜像文件放在tftp服务的文件夹里面,然后使用如下命令即可加载到内存中:

tftp C2000000 uImage #将linux内核镜像uImage加载到内存(DRAM,DDR)C2000000处

前提是服务器和uboot都要开启tftp服务

二.通过flash加载: 1.mmc命令

常见的flash有sd卡,emmc(一般认为sd卡也属于emmc)等,uboot配置好相关设备之后,通过以下几个关于mmc命令来查看这些设备的信息

1.列出所有mmc设备:mmc list

STM32MP> mmc list STM32 SD/MMC: 0 STM32 SD/MMC: 1 (eMMC) STM32MP>

这个命令调用之后,打印的信息,最后一列就是对应的mmc设备的编号,如上所示,我现在的板子上sd卡是编号0,eMMC是编号1

2.选中设备:mmc dev [要选中的设备编号]

STM32MP> mmc dev 0 Card did not respond to voltage select! STM32MP> mmc dev 1 switch to partitions #0, OK mmc1(part 0) is current device STM32MP>

3.打印出当前选中的mmc设备的信息:mmcinfo

#打印信息有点长,这里演示略

4.查看当前选中设备的分区信息:mmc part

STM32MP> mmc part Partition Map for MMC device 1 -- Partition Type: EFI Part Start LBA End LBA Name Attributes Type GUID Partition GUID 1 0x00000400 0x000013ff "ssbl" attrs: 0x0000000000000000 type: 8da63339-0007-60c0-c436-083ac8230908 guid: d5f296ca-d34e-478d-bd8f-3ef771b6fefd 2 0x00001400 0x000213ff "boot" attrs: 0x0000000000000004 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 type: linux guid: 540b4af6-44c8-4a53-bde6-7b4c4f8b2f24 3 0x00021400 0x00e8bc5f "rootfs" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 type: linux guid: 491f6117-415d-4f53-88c9-6e0de54deac6 STM32MP>

可以看出,有 3 个分区,第一个分区为名字为“ssbl”,用来存放 uboot 镜像,范围为:扇区 0x400~0x13ff。第二个分区名字为“boot”,用来存放 linux 内核和设备树镜像,也就是uboot需要加载到内存里的镜像之一,范围为:扇区 0x1400~0x213ff。第三个分区名字为“rootfs”,这个是根文系统分区,占用了剩余的所有扇区,也就是扇区 0x21400~0xe8fbff

以上就是常用的一下mmc命令,通过以上几个命令,我们现在知道了要加载的linux内核镜像和设备树在mmc 1:2(即编号为1的mmc设备,也就是eMMC的分区2),那么如何将其加载到内存里面呢?接下来将解决它!

2.ext4命令

仅仅知道inux内核镜像和设备树镜像在mmc 1:2是不够的,我们现在甚至连它俩的具体文件名字都不知道,只知道它们一某种文件格式存放在mmc 1:2中,而通过ext4相关命令,我们可以详细的列出mmc 1:2里面的所有文件,并且完成本文的终极任务----将它们加载到内存中!

实际上, linux内核镜像和设备树镜像都是ext4格式的文件,下面了解两个ext4相关的命令:

1.列出编号为m的mmc设备的分区n的所有ext4文件:ext4ls mmc n:m

STM32MP> ext4ls mmc 1:2 1024 . 1024 .. 2943 boot.scr.uimg 1024 lost+found 1024 mmc0_extlinux 1024 mmc1_extlinux 74892 stm32mp157d-atk.dtb 74336 stm32mp157d-atk-hdmi.dtb 75199 stm32mp157d-atk-mipi.dtb 3632241 uInitrd 1228872 alientek_1024x600.bmp 2048072 alientek_1280x800.bmp 261192 alientek_480x272.bmp 768072 alientek_800x480.bmp 8321176 uImage 1024 5.4.31-g8c3068500 74935 stm32mp157d-atk-spdif.dtb STM32MP>

其中stm32mp157d-atk.dtb是设备树镜像文件,uImage是linux内核镜像文件

2.指定mmc n:m 中的文件,将其加载到内存的相应地址中:ext4load mmc m:n [要加载的内存地址] 指定文件

STM32MP> ext4load mmc 1:2 C2000000 uImage 8321176 bytes read in 212 ms (37.4 MiB/s) STM32MP>

可以看出,加载速度非常之快,只用了212ms,高达37.4MiB/s

设备树的加载本人还没学习到,未来继续探讨

本文完结,感谢观看



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3