Page tree
Skip to end of metadata
Go to start of metadata

使用TFTP启动内核的方法前,需要在PC主机上安装TFTP服务器软件包。这里,我们通过U-Boot提供的pxelinux功能,从TFTP服务器下载位于pxelinux.cfg目录下的PXE配置文件。实现pxelinux功能的命令是pxe,执行后会在TFTP服务器的pxelinux.cfg目录中加载一个pxe配置文件并进行解析。


TFTP目录结构

使用U-Boot pxelinux功能从TFTP下载并启动Linux内核,TFTP目录的文件结构如下,TFTP的根目录为"/srv/tftp"。

/srv/tftp/
├── pxelinux.cfg
│   ├── 01-e2-2a-66-fc-e7-fa
├── stm32mp157a-panguboard.dtb
├── uImage

pxelinux.cfg是目录名。

01-e2-2a-66-fc-e7-fa为pxe配置文件名,内容与extlinux.cfg文件相同。

Linux内核的镜像文件uImage和设备树文件dtb都是放在"/srv/tftp"目录下。


pxelinux.cfg 目录

由于TFTP服务可能会被多个开发板使用,因此“ PXE配置文件”的名称取决于U-boot参数(板的硬件地址/ IP地址)。

U-Boot按如下顺序在pxelinux.cfg目录中搜索PXE配置文件:

  1. UUID的值由"pxeuuid"命令来得到
  2. 硬件类型和地址:ARP类型为"1"代表以太网和MAC地址
  3. IP地址是每个板子的子网掩码
  4. 文件被命令为"default-$CONFIG_SYS_ARCH-$CONFIG_SYS_SOC"

在TFTP服务器上至少每个板子需要提供一个配置文件。

以PanGu开发板为例

  • UUID 没有定义
  • ethaddr=e2:2a:66:fc:e7:fa
  • IP =192.168.2.167 (16进制编码为 C0A802A7)
  • CONFIG_SYS_ARCH=arm and CONFIG_SYS_SOC="stm32mp"


PXE配置文件内容

每个PXE配置文件的格式与由标准Yocto发行版生成的extlinux.conf文件相同。

对于菜单中的每个元素:

  • LABEL是一个字符串,例如引导设备,如e MMC、SD卡、NAND等等。
  • 通过KERNEL和FDT选项定义U-Boot加载的内核和设备树。
  • Linux内核启动参数是通过APPEND选项定义的,包括要使用的rootfs。
menu title Select the boot mode
DEFAULT eMMC
LABEL initramfs
 	KERNEL uImage
 	FDT stm32mp157a-panguboard.dtb
 	INITRD uInitrd
 	APPEND rootwait rw earlyprintk console=ttySTM0,115200
LABEL nfs
 	KERNEL uImage
 	FDT stm32mp157a-panguboard.dtb
 	APPEND root=/dev/nfs nfsroot=192.168.1.1:/nfsroot ip=dhcp rootwait rw earlyprintk console=ttySTM0,115200
LABEL sdcard
 	KERNEL uImage
 	FDT stm32mp157a-panguboard.dtb
 	APPEND root=/dev/mmcblk0p6 rootwait rw earlyprintk console=ttySTM0,115200
LABEL eMMC
 	KERNEL uImage
 	FDT stm32mp157a-panguboard.dtb
 	APPEND root=/dev/mmcblk1p6 rootwait rw earlyprintk console=ttySTM0,115200



在开发板的U-Boot下执行命令

 Board $> env set serverip <the TFTP of PC address>
 Board $> run bootcmd_pxe

<the TFTP of PC address>表示TFTP服务器的IP地址。


STM32MP> env set serverip 192.168.2.123
STM32MP> run bootcmd_pxe
BOOTP broadcast 1
DHCP client bound to address 192.168.2.167 (1 ms)
missing environment variable: pxeuuid
missing environment variable: bootfile
Retrieving file: pxelinux.cfg/01-e2-2a-66-fc-e7-fa
Using ethernet@5800a000 device
TFTP from server 192.168.2.123; our IP address is 192.168.2.167
Filename 'pxelinux.cfg/01-e2-2a-66-fc-e7-fa'.
Load address: 0xc4200000
Loading: #
	 3.9 KiB/s
done
Bytes transferred = 639 (27f hex)
Config file found
Select the boot mode
1:	initramfs
2:	nfs
3:	sdcard
4:	eMMC
Enter choice: 4
4:	eMMC
missing environment variable: bootfile
Retrieving file: uImage
Using ethernet@5800a000 device
TFTP from server 192.168.2.123; our IP address is 192.168.2.167
Filename 'uImage'.
Load address: 0xc2000000
Loading: #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #######################
	 591.8 KiB/s
done
Bytes transferred = 6053888 (5c6000 hex)
append: root=/dev/mmcblk1p6 rootwait rw earlyprintk console=ttySTM0,115200
missing environment variable: bootfile
Retrieving file: stm32mp157a-panguboard.dtb
Using ethernet@5800a000 device
TFTP from server 192.168.2.123; our IP address is 192.168.2.167
Filename 'stm32mp157a-panguboard.dtb'.
Load address: 0xc4000000
Loading: #####
	 581.1 KiB/s
done
Bytes transferred = 69115 (10dfb hex)
## Booting kernel from Legacy Image at c2000000 ...
   Image Name:   Linux-4.19.43
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    6053824 Bytes = 5.8 MiB
   Load Address: c2000040
   Entry Point:  c2000040
   Verifying Checksum ... OK
## Flattened Device Tree blob at c4000000
   Booting using the fdt blob at 0xc4000000
   XIP Kernel Image ... OK
   Using Device Tree in place at c4000000, end c4013dfa

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.19.43 (stevechen@PD12-debian) (gcc version 8.2.0 (GCC)) #14 SMP PREEMPT Mon Jan 13 16:10:22 CST 2020
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: i2SOM PanGu Board
.....
[    0.000000] Kernel command line: root=/dev/mmcblk1p6 rootwait rw earlyprintk console=ttySTM0,115200
.....
  • No labels