• 【linux kernel】以tftp方式启动linux内核


    开篇

    tftp英文全称(Trivial File Transfer Protocol),是一种简单的文件传输协议,该协议可用于网络主机与服务器之间传输小型文件。

    在嵌入式linux开发中,我们一般是在自己的个人电脑或者服务器上进行linux相关的编译构建,在编译构建完成后,生成的系统镜像、系统组件等文件需要烧写到具体的目标机子上。然而,在实际调试开发过程中,如果每修改一次系统镜像和组件就向目标机子烧写一次,这将是一件繁杂且低效率的事情,这时候,我们则可以在开发电脑和目标平台之间搭建tftp服务环境。这么做,我们可以很方便的通过tftp下载开发主机上的文件到目标平台上。

    在目前嵌入式linux开发中,u-boot作为一款常用的引导加载程序,它对tftp的支持很好,我们则可以通过tftp将开发主机上的linux内核镜像、设备树等文件下载到目标板卡的内存中执行。这么做,则有一个很重要的优点:那就是不用每修改一次内核或设备树就执行一次镜像烧写,从而减少烧写次数,加快开发效率。

    环境介绍

    在上图中,虚拟机ubuntu和目标硬件平台之间通过路由器连接在一起,且路由器关闭了DHCP功能,使用网线将运行虚拟机ubuntu的电脑和硬件板卡连接到路由器的两个Lan口(将路由器当做交换机来使用)。并设置虚拟机ubuntu与物理机之间网络为:桥接模式

    tftp服务搭建步骤

    在ubuntu终端中执行以下命令安装tftp服务:

    sudo apt-get install tftp-hpa tftpd-hpa
    
    • 1

    安装完成后,创建tftp服务的工作目录。这个目录可以自定义目录路径(一般是放在家目录下),本文将其放置在/home下,并命名为tftp_boot_server:

    mkdir -p /home/tftp_boot_server
    
    • 1

    创建完成后如下图所示:

    使用下列命令修改tftp_boot_server的权限:

    chmod 777 /home/tftp_boot_server
    
    • 1


    (权限修改后,上面会有颜色覆盖)

    使用编辑器打开tftp配置文件:

    sudo gedit /etc/default/tftpd-hpa
    
    • 1

    将文件修改如下:

    # /etc/default/tftpd-hpa
    
    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/home/tftp_boot_server"
    TFTP_ADDRESS=":69"
    TFTP_OPTIONS="-l-c-s"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上述参数中,TFTP_OPTIONS可选的参数有三个:

    • -l :表示以standalone/listen模式启动tftp服务。

    • -c :表示可创建新文件。默认情况下,tftp只允许覆盖原有文件,不能创建新文件。

    • -s :安全模式访问。启用该选项,访问tftp服务器时不再需要输入访问目录的完整路径,会自动使用配置文件中已经配置好的文件路径。

    配置文件修改完成后,保存退出,在终端下输入下列命令重启tftpd-hpa服务:

    sudo service tftpd-hpa restart
    
    • 1

    目标平台网络接入

    在本小节中,让我们把目标板卡接入虚拟机ubuntu。

    首先使用ifconfig查看一下虚拟机ubuntu的IP地址:

    在硬件平台启动的过程中,进入u-boot命令行下,使用setenv命令设置主机ip地址、tftp服务器的ip地址和网关:

    #设置硬件板卡的ip地址
    setenv ipaddr 192.168.255.253  
    
    #设置tftp服务器的ip地址(这里则是虚拟机ubuntu的地址)
    setenv serverip 192.168.255.254
    
    #设置网关地址
    serenv gateway 192.168.255.255
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    设置完成以后,在u-boot的命令行下使用ping命令检测硬件板卡与虚拟机ubuntu之间是否网络通畅。


    如上图红框所示,当看见“host xxx.xxx.xxx.xxx is alive”类似信息输出,则证明网络通畅。接下来,我们便可以在目标板卡的u-boot命令行下,使用tftp下载linux内核镜像文件和设备树文件了。

    tftp加载linux内核和设备树

    经过上述步骤,硬件板卡与虚拟机ubuntu之间的网络互联成功,我们就可以使用tftp来加载linux内核和设备树了,从而方便调试linux内核和设备树。

    然后在u-boot的命令行终端下使用:

    setenv bootcmd "tftpboot 0x08300000 rk3568-evb1-ddr4-v10-linux.dtb;tftpboot 0x0027f800 boot.img ; bootm 0x0027f800 - 0x08300000"
    
    • 1

    设置bootcmd环境变量参数。bootcmd是启动命令参数,用于存储u-boot的命令操作。在上述命令中:

    • rk3568-evb1-ddr4-v10-linux.dtb是用于描述硬件平台的设备树文件。
    • boot.img是linux内核镜像文件。

    命令的意思是:使用tftpboot将rk3568-evb1-ddr4-v10-linux.dtb设备树文件下载到0x08300000;使用tftpboot命令将boot.img文件下载到0x0027f800;然后使用bootm从上述两个内存启动应用镜像。这里则是存放于0x0027f800的linux内核和存放于0x08300000的设备树。

    接着使用:

    env run bootcmd
    
    • 1

    执行启动命令。随后,u-boot会自动以tftp方式从虚拟机ubuntu上下载linux内核和设备树文件,然后会运行linux内核。如下图所示

    总结

    在嵌入式linux开发中,tftp是经常使用到的一种文件传输方式,具体的参数配置可能由于不同环境有所不同,但是其tftp搭建和使用思路和方法大同小异,均可按照文本步骤和方法来使用。

  • 相关阅读:
    大话C#之WPF实践场景入门进阶,深入浅出解析教程 22 重写方法入门以及继承
    blender动画制作软件拓扑全流程
    美容院微信小程序怎么添加会员管理功能
    帝国竞争算法(ICA)(Matlab代码实现)
    VINS——Fusion学习01 官方教程翻译解读
    翻页-时钟
    C语言进阶——文件操作
    uniapp开发小程序,包过大解决方案
    【Java Web】论坛——我收到的赞
    C语言学习系列-->一篇带你看懂内存函数
  • 原文地址:https://blog.csdn.net/iriczhao/article/details/126443570