[31]_tftp下载kernel、rootfs并设置启动参数

这篇博客介绍了如何通过TFTP将kernel、rootfs烧写到16M SPI Flash中,并详细展示了烧写过程。同时,文章提及了设置启动参数的重要性,以及在启动过程中遇到的问题,如根文件系统未被正确执行,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3、烧写映像文件到SPI Flash
    以16M SPI Flash为例。
    1)地址空间说明
        |      1M       |      4M       |      11M      |
        |---------------|---------------|---------------|
        |     boot      |     kernel    |     rootfs    |

以下的操作均基于图示的地址空间分配,您也可以根据实际情况进行调整。
   2)烧写u-boot
        sf probe 0
        mw.b 82000000 ff 100000
        tftp 0x82000000 u-boot-hi3520D.bin
        sf probe 0
        sf erase 0 100000
        sf write 82000000 0 100000
        reset   

  3)烧写内核
        mw.b 82000000 ff 400000
        tftp 82000000 uImage_hi3520d
        sf probe 0
        sf erase 100000 400000
        sf write 82000000 100000 400000

4) 烧写文件系统
        mw.b 82000000 ff b00000
        tftp 0x82000000 rootfs_uclibc_256k.jffs2
        sf erase 500000 b00000
        sf write 82000000 500000 b00000

5)设置启动参数

setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)'

setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'
        saveenv

我的虚拟机服务器上的系统镜像:

root@ubuntu:/tftpboot# ls
rootfs_uclibc_256k.jffs2  u-boot_hi3520d.bin  uImage_hi3520d_full


hisilicon # mw.b 82000000 ff 400000

hisilicon # tftp 82000000 uImage_hi3520d_full
Hisilicon ETH net controler
miiphy_register: non unique device name '0:3'
miiphy_register: non unique device name '0:2'
MAC:   00-00-23-34-45-66

UP_PORT : phy status change : LINK=DOWN : DUPLEX=FULL : SPEED=100M
UP_PORT : phy status change : LINK=UP : DUPLEX=FULL : SPEED=100M
TFTP from server 192.168.15.1xx; our IP address is 192.168.15.1xx
Download Filename 'uImage_hi3520d_full'.

Download to address: 0x82000000
Downloading: #################################################
done

Bytes transferred = 3196076 (30c4ac hex)
hisilicon # sf probe 0

16384 KiB hi_sfc at 0:0 is now current device
hisilicon #         sf eras        sf write 82000000 100000 400000
sf - SPI flash sub-system

hisilicon # sf probe 0
16384 KiB hi_sfc at 0:0 is now current device
hisilicon # sf erase 100000 400000
Erasing at 0x500000 -- 100% complete.

hisilicon # sf write 82000000 100000 400000

Writing at 0x500000 -- 100% complete.
hisilicon # mw.b 82000000 ff b00000

hisilicon # tftp 0x82000000 rootfs_uclibc_256k.jffs2
Hisilicon ETH net controler
miiphy_register: non unique device name '0:3'
miiphy_register: non unique device name '0:2'
MAC:   00-00-23-34-45-66

UP_PORT : phy status change : LINK=DOWN : DUPLEX=FULL : SPEED=100M
UP_PORT : phy status change : LINK=UP : DUPLEX=FULL : SPEED=100M
TFTP from server 192.168.15.1xx; our IP address is 192.168.15.1xx
Download Filename 'rootfs_uclibc_256k.jffs2'.

Download to address: 0x82000000
Downloading: #################################################
done

Bytes transferred = 6976840 (6a7548 hex)
hisilicon # sf erase 500000 b00000
Erasing at 0x1000000 -- 100% complete.

hisilicon # setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)

hisilicon # setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'
hisilicon # saveenv

Saving Environment to SPI Flash...
Erasing SPI flash, offset 0x00080000 size 256K ...done
Writing to SPI flash, offset 0x00080000 size 256K ...done

hisilicon # reset


执行后出现:

VFS: Mounted root (jffs2 filesystem) on device 31:2.
Freeing init memory: 140K
Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.

很明显是根文件系统上的linuxrc没有被执行,官方给的需要参数还是存在问题的,于是我在传参中指定了init进程的位置。

hisilicon # setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs),init=/linuxrc

出现了下面的这种情况:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

参考网络的一些说法,rootfs_uclibc_256k.jffs2可能没有被烧写到正确的位置,不过我看了内核启动打印的信息,地址是正确的,也有可能是我没真正把rootfs烧写了spi flash 上,于是我用tftp重新烧写了rootfs,启动后果然是: 

VFS: Mounted root (jffs2 filesystem) on device 31:2.
Freeing init memory: 140K
Kernel panic - not syncing: Attempted to kill init!





在网络环境中通过U-Boot加载内核启动的过程通常涉及以下步骤: 1. **设置网络环境**: - 首先,确保U-Boot支持网络功能,配置相应的环境变量,比如`ipaddr`, `serverip`(服务器IP), `tftpport`(TFTP服务器端口),以及可能的`netmask`和`gw`。 2. **下载内核和启动文件**: - 定义`image_file`环境变量来指示从何处(通常是TFTP服务器)下载内核镜像(`KERNEL_NAME.tgz`)。使用`fatload`命令将内核和启动引导装载程序加载到内存,如: ``` fatload mmc 0:1 ${kernel_image_offset} ${image_file} ``` 3. **启动内核**: - 完成加载后,使用`bootm`命令启动内核,包括加载地址和启动参数,例如: ``` bootm ${kernel_image_offset} ${second_image_offset} ${cmdline} ``` 4. **网络文件系统挂载**: - 如果内核需要从网络获取根文件系统(如`rootfs.tar.gz`),同样地,设置`fs_load_addr`和`fs_file`指向文件的位置。使用`tftpget`下载文件到内存。 - 启动时通过`fat_mount`命令挂载文件系统,如: ``` tftpget ${fs_server_ip} ${fs_file} ${fs_load_addr} fat_mount ${fs_dev} ${fs_load_addr} ${fs_name} ``` - 将这个挂载点添加到`environment`中,以便在内核启动过程中生效。 5. **设置`bootcmd`**: - 可以将上述网络文件系统挂载操作作为`bootcmd`环境变量的一部分,这样每次启动时都会自动执行。 注意:整个过程依赖于网络稳定性和服务器的可用性。如果网络不可靠,可以考虑配置本地存储或者备用网络路径作为应急措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值