bootloaders

什么是BootLoader?

一般来说,bootloader是一种软件/固件,它在SoC上电后立即运行。bootloader的主要职责是启动软件的后续部分,例如操作系统、baremetal应用程序或在某些情况下另一个bootloader。当涉及到嵌入式时,bootloader通常与底层SoC体系结构密切相关。bootloader通常存储在一个受保护的、非易失性的片上存储器中。通常bootloader执行各种硬件检查,初始化处理器和配置SoC寄存器等。由于bootloader的主要目的是加载下一个软件,因此它需要与外部通信以接收此固件/应用程序映像。这可以通过许多协议- USB, UART, SPI, I2C,外部闪存,内部闪存,SD卡,以太网,can等。bootloader也是嵌入式安全性中的一个关键组件。硬件信任根通常被传递到bootloader,并沿着线路传递。

在MCU+SDK支持的设备中,第一bootloader被刻录到设备的只读存储器中,被认为是设备固件/ ROM。在MCU+SDK中,所说的“bootloader”大多指的是二级bootloader,或SBL。

Multi-Stage Bootloader

出于安全考虑,第一个bootloader通常保存在安全的只读内存中,并且在应用程序软件启动之前总是有一个已知的状态。因此,保持这个bootloader的简单性并让它只执行所需的最低配置是有意义的。这个辅助引导加载程序可以很复杂,也可以进行配置,以满足应用程序的需要。与第一阶段bootloader相比,这也可以很容易地更新。事实上,对于MCU+SDK中的设备,我们有两个阶段的引导加载程序——第一个阶段的bootloader称为ROM bootloader (RBL),第二个阶段的bootloader称为Secondary bootloader (SBL)。

Multi-Core BootLoading

当有多阶段引导加载时,多核引导加载几乎总是一个后续。在这种情况下,第一个bootloader技术上可能甚至不知道其他核心,它只会引导下一个阶段的bootloader,而第二个阶段的bootloader将负责不同核心上的复杂引导加载
加载多核应用程序比加载单核应用程序稍微复杂一些。在映像准备、共享内存访问等方面存在一些问题。大多数情况下,会有一种特定的格式来创建各个核心图像,然后它们可能会/可能不会被连接到单个图像中供SBL加载。无论应用程序图像的格式是什么,SBL都应该知道它,以便正确地解析和加载图像。

Hit any key to stop autoboot:  0
=> mmc list
mmc@fa10000: 0
mmc@fa00000: 1 (SD)
=> printenv partitions
partitions=name=rootfs,start=0,size=-,uuid=${uuid_gpt_rootfs}
=> uuidgen
Unknown command 'uuidgen' - try 'help'
=> uuidgen -try
Unknown command 'uuidgen' - try 'help'
=> mmc part

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     1               522240          f9b70d9c-01     0c Boot
  2     522241          4700160         f9b70d9c-02     83
=>
=> mmc dev
switch to partitions #0, OK
mmc0(part 0) is current device
=> mmc list
mmc@fa10000: 0 (eMMC)
mmc@fa00000: 1 (SD)
=> mmc dev
switch to partitions #0, OK
mmc0(part 0) is current device
=> mmc read
mmc - MMC sub system

Usage:
mmc info - display info of the current MMC device
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan [mode]
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] [mode] - show or set current mmc device [partition] and set mode
  - the required speed mode is passed as the index from the following list
    [MMC_LEGACY, MMC_HS, SD_HS, MMC_HS_52, MMC_DDR_52, UHS_SDR12, UHS_SDR25,
    UHS_SDR50, UHS_DDR50, UHS_SDR104, MMC_HS_200, MMC_HS_400, MMC_HS_400_ES]
mmc list - lists available devices
mmc wp - power on write protect boot partitions
mmc hwpartition [args...] - does hardware partitioning
  arguments (sizes in 512-byte blocks):
    [user [enh start cnt] [wrrel {on|off}]] - sets user data area attributes
    [gp1|gp2|gp3|gp4 cnt [enh] [wrrel {on|off}]] - general purpose partition
    [check|set|complete] - mode, complete set partitioning completed
  WARNING: Partitioning is a write-once setting once it is set to complete.
  Power cycling is required to initialize partitions after set to complete.
mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
 - Set the BOOT_BUS_WIDTH field of the specified device
mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>
 - Change sizes of boot and RPMB partitions of specified device
mmc partconf dev [boot_ack boot_partition partition_access]
 - Show or change the bits of the PARTITION_CONFIG field of the specified device
mmc rst-function dev value
 - Change the RST_n_FUNCTION field of the specified device
   WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.
mmc setdsr <value> - set DSR register value


=> printenv
addr_fit=0x90000000
arch=arm
args_all=setenv optargs ${optargs} earlycon=ns16550a,mmio32,0x02800000 ${mtdparts}
args_mmc=run finduuid;setenv bootargs console=${console} ${optargs} root=PARTUUID=${uuid} rw rootfstype=${mmcrootfstype}
args_nand=setenv bootargs console=${console} ${optargs} ubi.mtd=${nbootpart} root=${nbootvolume} rootfstype=ubifs
args_usb=run finduuid;setenv bootargs console=${console} ${optargs} root=PARTUUID=${uuid} rw rootfstype=${mmcrootfstype}
baudrate=115200
board=am64x
board_name=am64x_gpevm
board_rev=A
board_serial=0230
board_software_revision=01
boot=mmc
boot_fdt=try
boot_fit=0
bootcmd=run findfdt; run envboot; run init_${boot}; if test ${boot_fit} -eq 1; then run get_fit_${boot}; run get_overlaystring; run run_fit; else; run get_kern_${boot}; run get_fdt_${boot}; run get_overlay_${boot}; run run_kern; fi;
bootdelay=2
bootdir=/boot
bootenvfile=uEnv.txt
bootm_size=0x10000000
bootpart=1:2
bootscript=echo Running bootscript from mmc${mmcdev} ...; source ${loadaddr}
console=ttyS2,115200n8
cpu=armv8
dfu_alt_info_emmc=rawemmc raw 0 0x800000 mmcpart 1;rootfs part 0 1 mmcpart 0;tiboot3.bin.raw raw 0x0 0x800 mmcpart 1;tispl.bin.raw raw 0x800 0x1000 mmcpart 1;u-boot.img.raw raw 0x1800 0x2000 mmcpart 1;u-env.raw raw 0x3800 0x100 mmcpart 1
dfu_alt_info_mmc=boot part 1 1;rootfs part 1 2;tiboot3.bin fat 1 1;tispl.bin fat 1 1;u-boot.img fat 1 1;uEnv.txt fat 1 1;sysfw.itb fat 1 1
dfu_alt_info_ospi=tiboot3.bin raw 0x0 0x100000;tispl.bin raw 0x100000 0x200000;u-boot.img raw 0x300000 0x400000;u-boot-env raw 0x700000 0x020000;rootfs raw 0x800000 0x3800000
dfu_alt_info_ram=tispl.bin ram 0x80080000 0x200000;u-boot.img ram 0x81000000 0x400000
dtboaddr=0x89000000
envboot=mmc dev ${mmcdev}; if mmc rescan; then echo SD/MMC found on device ${mmcdev};if run loadbootscript; then run bootscript;else if run loadbootenv; then echo Loaded env from ${bootenvfile};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;fi;fi;
eth1addr=70:ff:76:1e:28:b8
eth2addr=70:ff:76:1e:28:b9
ethaddr=f4:84:4c:f9:7d:05
fdt_addr_r=0x88000000
fdtaddr=0x88000000
fdtcontroladdr=edeb7880
fdtoverlay_addr_r=0x80200000
findfdt=if test $board_name = am64x_gpevm; then setenv fdtfile k3-am642-evm.dtb; fi; if test $board_name = am64x_skevm; then setenv fdtfile k3-am642-sk.dtb; fi;if test $fdtfile = undefined; then echo WARNING: Could not determine device tree to use; fi;
finduuid=part uuid ${boot} ${bootpart} uuid
get_fdt_mmc=load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
get_fdt_nand=ubifsload ${fdtaddr} ${bootdir}/${fdtfile};
get_fdt_usb=load usb ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
get_fit_mmc=load mmc ${bootpart} ${addr_fit} ${bootdir}/${name_fit}
get_fit_nand=ubifsload ${addr_fit} ${bootdir}/${name_fit}
get_fit_usb=load usb ${bootpart} ${addr_fit} ${bootdir}/${name_fit}
get_kern_mmc=load mmc ${bootpart} ${loadaddr} ${bootdir}/${name_kern}
get_kern_nand=ubifsload ${loadaddr} ${bootdir}/${name_kern}
get_kern_usb=load usb ${bootpart} ${loadaddr} ${bootdir}/${name_kern}
get_overlay_mmc=fdt address ${fdtaddr};fdt resize 0x100000;for overlay in $name_overlays;do;load mmc ${bootpart} ${dtboaddr} ${bootdir}/${overlay} && fdt apply ${dtboaddr};done;
get_overlay_nand=fdt address ${fdtaddr};fdt resize 0x100000;for overlay in $name_overlays;do;ubifsload ${dtboaddr} ${bootdir}/${overlay} && fdt apply ${dtboaddr};done;
get_overlay_usb=fdt address ${fdtaddr};fdt resize 0x100000;for overlay in $name_overlays;do;load usb ${bootpart} ${dtboaddr} ${bootdir}/${overlay} && fdt apply ${dtboaddr};done;
get_overlaystring=for overlay in $name_overlays;do;setenv overlaystring ${overlaystring}'#'${overlay};done;
importbootenv=echo Importing environment from mmc${mmcdev} ...; env import -t ${loadaddr} ${filesize}
init_mmc=run args_all args_mmc
init_nand=run args_all args_nand ubi_init
init_usb=run args_all args_usb
kernel_addr_r=0x82000000
loadaddr=0x82000000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenvfile}
loadbootscript=load mmc ${mmcdev} ${loadaddr} boot.scr
loadfdt=load ${devtype} ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
loadimage=load ${devtype} ${bootpart} ${loadaddr} ${bootdir}/${bootfile}
mmcboot=mmc dev ${mmcdev}; devnum=${mmcdev}; devtype=mmc; if mmc rescan; then echo SD/MMC found on device ${mmcdev};if run loadimage; then run args_mmc; if test ${boot_fit} -eq 1; then run run_fit; else run mmcloados;fi;fi;fi;
mmcdev=1
mmcloados=if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} - ${fdtaddr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
mmcrootfstype=ext4 rootwait
mtdids=nor0=fc40000.spi.0,nand0=omap2-nand.0
mtdparts=mtdparts=fc40000.spi.0:1m(ospi.tiboot3),2m(ospi.tispl),4m(ospi.u-boot),256k(ospi.env),256k(ospi.env.backup),57088k@8m(ospi.rootfs),256k(ospi.phypattern);omap2-nand.0:2m(NAND.tiboot3),2m(NAND.tispl),2m(NAND.tiboot3.backup),4m(NAND.u-boot),256k(NAND.u-boot-env),256k(NAND.u-boot-env.backup),-(NAND.file-system)
name_fit=fitImage
name_kern=Image
nbootpart=NAND.file-system
nbootvolume=ubi0:rootfs
partitions=name=rootfs,start=0,size=-,uuid=${uuid_gpt_rootfs}
pxefile_addr_r=0x80100000
ramdisk_addr_r=0x88080000
rd_spec=-
rdaddr=0x88080000
run_fit=bootm ${addr_fit}#${fdtfile}${overlaystring}
run_kern=booti ${loadaddr} ${rd_spec} ${fdtaddr}
scriptaddr=0x80000000
serial#=0000000000000230
soc=k3
stderr=serial@2800000
stdin=serial@2800000
stdout=serial@2800000
ubi_init=ubi part ${nbootpart}; ubifsmount ${nbootvolume};
update_to_fit=setenv loadaddr ${addr_fit}; setenv bootfile ${name_fit}
usbboot=setenv boot usb;setenv bootpart 0:2;usb start;run findfdt;run init_usb;run get_kern_usb;run get_fdt_usb;run run_kern
vendor=ti


Environment size: 5742/131068 bytes



错误记录:以下流程并不能成功的从eMMC启动,分区存在问题,应按照Flash Linux to eMMc进行
root@am64xx-evm:~# uuidgen
b8988730-0989-4d66-9951-175b5874a726
root@am64xx-evm:~# uuidgen
7d70f57d-5c14-4264-a117-354ab179f85a


Partitioning eMMC from U-Boot

=> printenv partitions
partitions=name=rootfs,start=0,size=-,uuid=${uuid_gpt_rootfs}
=> setenv uuid_gpt_disk b8988730-0989-4d66-9951-175b5874a726
=> setenv uuid_gpt_disk 7d70f57d-5c14-4264-a117-354ab179f85a
=> mmc list
mmc@fa10000: 0
mmc@fa00000: 1 (SD)

=> gpt write mmc 0 ${partitions}
Writing GPT: success!


=> mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000022      0x01da3fde      "rootfs"
        attrs:  0x0000000000000000
        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid:   76a96b6e-570c-2344-96f9-059fa509c224
=> setenv uuid_gpt_disk b8988730-0989-4d66-9951-175b5874a726
=> setenv uuid_gpt_rootfs 7d70f57d-5c14-4264-a117-354ab179f85a
=> gpt write mmc 0 ${partitions}
Writing GPT: success!


=> mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000022      0x01da3fde      "rootfs"
        attrs:  0x0000000000000000
        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid:   7d70f57d-5c14-4264-a117-354ab179f85a
=> printenv dfu_alt_info_mmc
dfu_alt_info_mmc=boot part 1 1;rootfs part 1 2;tiboot3.bin fat 1 1;tispl.bin fat 1 1;u-boot.img fat 1 1;uEnv.txt fat 1 1;sysfw.itb fat 1 1
=> mmc dev 0
switch to partitions #0, OK
mmc0(part 0) is current device
=> printenv dfu_alt_info_mmc
dfu_alt_info_mmc=boot part 1 1;rootfs part 1 2;tiboot3.bin fat 1 1;tispl.bin fat 1 1;u-boot.img fat 1 1;uEnv.txt fat 1 1;sysfw.itb fat 1 1
=> mmc dev 1
switch to partitions #0, OK
mmc1 is current device
=> printenv dfu_alt_info_mmc
dfu_alt_info_mmc=boot part 1 1;rootfs part 1 2;tiboot3.bin fat 1 1;tispl.bin fat 1 1;u-boot.img fat 1 1;uEnv.txt fat 1 1;sysfw.itb fat 1 1
=> setenv dfu_alt_info ${dfu_alt_info_mmc}
=> dfu 0 mmc 0
Couldn't find part #2 on mmc device #1
DFU entities configuration failed!
(partition table does not match dfu_alt_info?)
dfu - Device Firmware Upgrade

Usage:
dfu <USB_controller> [<interface> <dev>] [list]
  - device firmware upgrade via <USB_controller>
    on device <dev>, attached to interface
    <interface>
    [list] - list available alt settings

=> mmc dev 0
switch to partitions #0, OK
mmc0(part 0) is current device
=> setenv dfu_alt_info ${dfu_alt_info_mmc}
=> dfu 0 mmc 0
Couldn't find part #2 on mmc device #1
DFU entities configuration failed!
(partition table does not match dfu_alt_info?)
dfu - Device Firmware Upgrade

Usage:
dfu <USB_controller> [<interface> <dev>] [list]
  - device firmware upgrade via <USB_controller>
    on device <dev>, attached to interface
    <interface>
    [list] - list available alt settings

=> mmc dev 0 1
switch to partitions #1, OK
mmc0(part 1) is current device
=> fatload mmc 1 ${loadaddr} tispl.bin
855435 bytes read in 37 ms (22 MiB/s)
=> mmc write ${loadaddr} 0x0 0x800

MMC write: dev # 0, block # 0, count 2048 ... 2048 blocks written: OK
=> fatload mmc 1 ${loadaddr} tiboot3.bin
563594 bytes read in 25 ms (21.5 MiB/s)
=> mmc write ${loadaddr} 0x0 0x800

MMC write: dev # 0, block # 0, count 2048 ... 2048 blocks written: OK
=> fatload mmc 1 ${loadaddr} tispl.bin
855435 bytes read in 37 ms (22 MiB/s)
=> mmc write ${loadaddr} 0x800 0x1000

MMC write: dev # 0, block # 2048, count 4096 ... 4096 blocks written: OK
=> fatload mmc 1 ${loadaddr} u-boot.img
1119679 bytes read in 49 ms (21.8 MiB/s)
=> mmc write ${loadaddr} 0x1800 0x2000

MMC write: dev # 0, block # 6144, count 8192 ... 8192 blocks written: OK
=> mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

GUID Partition Table Header signature is wrong: 0x32472641DEEE9E91 != 0x5452415020494645
find_valid_gpt: *** ERROR: Invalid GPT ***
GUID Partition Table Header signature is wrong: 0x0 != 0x5452415020494645
find_valid_gpt: *** ERROR: Invalid Backup GPT ***
=> mmc partconf 0 1 1 1
=> mmc bootbus 0 2 0 0
=> mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

GUID Partition Table Header signature is wrong: 0x32472641DEEE9E91 != 0x5452415020494645
find_valid_gpt: *** ERROR: Invalid GPT ***
GUID Partition Table Header signature is wrong: 0x0 != 0x5452415020494645
find_valid_gpt: *** ERROR: Invalid Backup GPT ***

=> mmc info
Device: mmc@fa10000
Manufacturer ID: 13
OEM: 14e
Name: S0J56
Bus Speed: 200000000
Mode: HS400 (200MHz)
Rd Block Len: 512
MMC version 5.1
High Capacity: Yes
Capacity: 14.8 GiB
Bus Width: 8-bit DDR
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 14.8 GiB WRREL
Boot Capacity: 31.5 MiB ENH
RPMB Capacity: 4 MiB ENH
Boot area 0 is not write protected
Boot area 1 is not write protected
=> mmc list
mmc@fa10000: 0 (eMMC)
mmc@fa00000: 1 (SD)
=> mmc dev 1
switch to partitions #0, OK
mmc1 is current device
=> mmc info
Device: mmc@fa00000
Manufacturer ID: 3
OEM: 5344
Name: SB16G
Bus Speed: 50000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 14.8 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes

// fatinfo 命令用于查询指定 MMC 设置指定分区的文件系统信息,格式如下:
=> fatinfo mmc 1:1
Interface:  MMC
  Device 1: Vendor: Man 000003 Snr 4e29fe01 Rev: 10.4 Prod: SB16G▒
            Type: Removable Hard Disk
            Capacity: 15193.5 MB = 14.8 GB (31116288 x 512)
Filesystem: FAT16 "boot       "


// fatls 命令用于查询 FAT 格式设备的目录和文件信息,命令格式如下
=> fatls mmc 1:1
     1490   uEnv.txt
      318   wificfg
            System Volume Information/
   131072   uboot.env
        1   .psdk_setup
   563594   tiboot3.bin
   855435   tispl.bin
  1119679   u-boot.img

7 file(s), 1 dir(s)

//fstype 用于查看 MMC 设备某个分区的文件系统格式,命令格式如下:
=> fstype mmc 1:1
fat
=> fstype mmc 1:2
ext4

=>  mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000022      0x01da3fde      "rootfs"
        attrs:  0x0000000000000000
        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid:   7d70f57d-5c14-4264-a117-354ab179f85a
=> mmc dev 1
switch to partitions #0, OK
mmc1 is current device
=>  mmc part

Partition Map for MMC device 1  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     2048            275610          ade9031b-01     0c Boot
  2     278528          5151216         ade9031b-02     83
=> mmc dev 0
switch to partitions #0, OK
mmc0(part 0) is current device
=>  mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x00000022      0x01da3fde      "rootfs"
        attrs:  0x0000000000000000
        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
        guid:   7d70f57d-5c14-4264-a117-354ab179f85a
=> printenv dfu_alt_info_mmc
dfu_alt_info_mmc=boot part 1 1;rootfs part 1 2;tiboot3.bin fat 1 1;tispl.bin fat 1 1;u-boot.img fat 1 1;uEnv.txt fat 1 1;sysfw.itb fat 1 1
=> mmc dev 1
switch to partitions #0, OK
mmc1 is current device
=> printenv dfu_alt_info_mmc
dfu_alt_info_mmc=boot part 1 1;rootfs part 1 2;tiboot3.bin fat 1 1;tispl.bin fat 1 1;u-boot.img fat 1 1;uEnv.txt fat 1 1;sysfw.itb fat 1 1
=> mmc dev 01
switch to partitions #0, OK
mmc1 is current device
=> mmc dev 0 1
switch to partitions #1, OK
mmc0(part 1) is current device
=> fatload mmc 1 ${loadaddr} tiboot3.bin
563594 bytes read in 26 ms (20.7 MiB/s)
=> mmc write ${loadaddr} 0x0 0x800

MMC write: dev # 0, block # 0, count 2048 ... 2048 blocks written: OK
=> fatload mmc 1 ${loadaddr} tispl.bin
855435 bytes read in 37 ms (22 MiB/s)
=> mmc write ${loadaddr} 0x800 0x1000

MMC write: dev # 0, block # 2048, count 4096 ... 4096 blocks written: OK
=> fatload mmc 1 ${loadaddr} u-boot.img
1119679 bytes read in 49 ms (21.8 MiB/s)
=> mmc write ${loadaddr} 0x1800 0x2000

MMC write: dev # 0, block # 6144, count 8192 ... 8192 blocks written: OK
=> mmc partconf 0 1 1 1
=> mmc bootbus 0 2 0 0
=> saveenv
Saving Environment to FAT... OK
=> setenv mmcdev 0
=> setenv bootpart 0
=> saveenv
Saving Environment to FAT... OK
=> mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

GUID Partition Table Header signature is wrong: 0x32472641DEEE9E91 != 0x5452415020494645
find_valid_gpt: *** ERROR: Invalid GPT ***
GUID Partition Table Header signature is wrong: 0x0 != 0x5452415020494645
find_valid_gpt: *** ERROR: Invalid Backup GPT ***

=> boot
switch to partitions #0, OK
mmc0(part 0) is current device
SD/MMC found on device 0
** Unrecognized filesystem type **
** Unrecognized filesystem type **
** Unrecognized filesystem type **
** Unrecognized filesystem type **
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
No FDT memory address configured. Please configure
the FDT address via "fdt addr <address>" command.
Aborting!
Bad Linux ARM64 Image magic!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值