Day01_Linux移植基础

linux移植基础

1.Linux移植主要内容

1.1bootloader-系统启动引导程序:

在开发板上运行里linux内核程序之前先运行一个bootloader程序,这个程序会对开发板上的芯片进行初步的初始化,让板子能够适配我们运行的linux内核,我们使用的是uboot

1.2Linux内核镜像文件:

linux操作系统主要的核心,其实这就是linux操作系统

1.3设备树镜像文件:

在开发板运行linux内核程序时,想要让linux内核可以充分调度硬件资源,我们会将板子上面的硬件信息保存在设备树上,当内核运行时会在设备树上获取板子的硬件设备信息,基于获取到的硬件设备信息完成硬件的控制。

1.4根文件系统的移植:

我们想要基于linux操作系统对开发板的磁盘空间进行正常的数据访问,需要将磁盘空间挂载到一个/文件系统中,所以linux移植过程中需要移植一个linux根文件操作系统

cpp 复制代码
1. tf-a-stm32mp157a-fsmp1a-trusted.stm32
--> tf-a的镜像文件,tf-a源码编译生成
--> 下载到TF卡或者EMMC中,默认已经下载好了。

2. u-boot-stm32mp157a-fsmp1a-trusted.stm32
--> u-boot的镜像文件,u-boot源码编译生成
--> 下载到TF卡或者EMMC中,默认已经下载好了。

3. uImage
--> linux内核的镜像文件,linux内核源码编译生成
--> 使用tftp命令下载到开发板的内存中

4. stm32mp157a-fsmp1a.dtb
--> linux内核的设备树文件,linux内核源码编译设备树文件生成
--> 使用tftp命令下载到开发板的内存中

5. rootfs
--> 根文件系统,根文件系统移植时生成rootfs
--> 使用nfs网络文件系统从ubuntu服务器挂载跟文件系统

2.Linux移植环境安装

2.1TFTP服务

bash 复制代码
##安装
sudo apt-get install tftpd-hpa tftp-hpa

##打开配置文件
sudo vi /etc/default/tftpd-hpa

##vim编辑
# 用户名tftp
TFTP_USERNAME="tftp" 
# tftp下载文件的路径,文件上传下载的仓库
# 需要修改为自己ubuntu系统的路径
# 将要把下载到开发板中的文件存
TFTP_DIRECTORY="/home/ubuntu/tftpboot" 
# tftp服务的端口号
TFTP_ADDRESS="0.0.0.0:69" 
# tftp的选项
TFTP_OPTIONS="-c -s -l" 

##创建文件夹
cd
mkdir tftpboot
chmod 777 tftpboot

##重启tftp服务器使修改后的环境变量立即生效
sudo service tftpd-hpa restart #或者执行sudo /etc/init.d/tftpd-hpa restart

##测试
tftp 127.0.0.1
tftp > get 1.c
tftp > put 2.c
tftp > q

2.2NFS服务

bash 复制代码
nfs服务:网络文件系统(Network File System)
作用:开发板通过网络的方式远程从ubuntu服务器端挂载跟文件系统

1. 安装nfs服务器端
sudo apt-get install nfs-kernel-server

2. 修改nfs服务的配置文件
打开sudo vi /etc/exports,在配置文件的最后一行添加以下内容
/home/ubuntu/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)
	解释:
	/home/linux/nfs/rootfs:跟文件系统的路径,修改为自己的路径
	* ---> 指所有的用户
	rw ---> 对跟文件系统可读可写的权限
	sync ---> 同步文件
	no_root_squash ---> 如何客户端为root用户,那对文件系统有root的权限
	no_subtree_check ---> 不检查子目录的权限
	注:
	1> *( : 之间不可以出现空格
	2> rw,sync,no_root_squash,no_subtree_check
	逗号后边不允许有空格
	3> 前边不要加#,#是注释

3. 创建nfs文件夹
1> 创建nfs文件夹
cd ~
mkdir nfs
chmod 777 nfs
2> 拷贝跟文件系统的压缩包rootfs-ok.tar.xz到nfs目录下
可以是共享文件夹或直接拖拽。
rootfs-ok.tar.xz ----》跟文件系统的压缩包
3> 使用tar对跟文件系统进行解压缩
tar -vxf rootfs-ok.tar.xz
解压缩之后会得到一个rootfs的文件夹
注:不要在windows下进行解压缩,windows不支持软连接文件


4. 重启nfs服务使其立即生效
sudo service nfs-kernel-server restart
或者
sudo /etc/init.d/nfs-kernel-server restart
注:只要修改配置文件,就需要重启服务

5. 本地测试nfs服务是否安装成功
sudo mount -t nfs IP地址:/home/linux/nfs/rootfs /mnt
使用nfs文件系统挂载跟文件系统到/mnt目录下,
IP地址必须是自己ubuntu的IP地址。-t nfs : 指定文件系统的类型, 使用nfs服务的方式进行挂载
是否挂载成功可以使用以下命令进行查看:
ls /mnt

6. 测试没有问题,就可以卸载跟文件系统
sudo umount /mnt
注意:不可以在/mnt目录下执行卸载的命令,否则会报设备忙的错误

3.交叉编译工具链

arm-linux-gnueabihf-

cpp 复制代码
交叉编译工具链的详细的安装步骤:
1. 在ubuntu的家目录下创建toolchain目录
cd ~
mkdir toolchain

2. 拷贝交叉编译工具链的压缩包到ubuntu的~/toolchain目录下
交叉编译工具链的压缩包的路径:
STM32MP157-学生资料\02_开发工具\02.5_ubuntu版本交叉编译工具链\
gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz

3. 使用tar命令进行解压缩
tar -vxf gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz

4. 解压缩成功之后得到一个gcc-linaro-7.5.0-2019.12-i686_arm-linux
gnueabihf,修改文件加额名字
mv gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf gcc-7.5.0

5. 交叉编译工具链的路径为:
~/toolchain/gcc-7.5.0/bin

6. 修改PATH环境变量,将交叉编译工具链的路径添加到PATH环境变量中
/etc/bash.bashrc --》 对所有的用户都有效
/etc/profile --》 对所有的用户都有效
/etc/environment --》 对所有的用户都有效
~/.bashrc --》 对当前的用户都有效
修改/etc/bash.bashrc文件,在这个文件的最后一行添加以下内容:
export PATH=$PATH:/home/linux/toolchain/gcc-7.5.0/bin/
修改为自己的交叉编译工具链的路径

7. 使修改后的环境变量立即生效
source /etc/bash.bashrc

8. 测试是否安装成功
arm-linux-gnueabihf-gcc -v ---> 查看交叉编译工具链的版本号
打印一些结果表示安装成功:
gcc version 7.5.0 (Linaro GCC 7.5-2019.12)

9. 安装一个32位软件的兼容库
9.1 ubuntu必须可以联网
9.2 配置源
打开源的配置文件/etc/apt/sources.list,将https修改为http
9.3. 更新源
sudo apt-get update
9.4 安装lib32z1库
sudo apt-get install lib32z1

总结:
在实际的开发中,不同的硬件平台,由于内核源码,u-boot源码的版本号的不同,
可能使用的交叉编译工具链的版本也不相同,因此在实际开发中要根据自己的
硬件平台安装对应版本的交叉编译工具链。

3.1部署流程

3.2设置开发板u-boot的网络:

cpp 复制代码
需要设置u-boot中的serverip ipaddr netmask gatewayip环境变量。
设置开发板u-boot的ip地址:
FSMP1A> setenv serverip 192.168.1.250
FSMP1A> setenv ipaddr 192.168.1.10
FSMP1A> setenv netmask 255.255.255.0
FSMP1A> setenv gatewayip 192.168.1.1
FSMP1A> saveenv
注:开发板的IP地址的网段必须和ubuntu系统的网段在同一个网段之上。

4.系统启动流程

  1. ROM:基本时钟初始化,搬移引导1

  2. Stage1:完成时钟初始化,初始化外部RAM,初始化栈空间,搬移引导2,屏蔽中断看门狗

  3. Stage2:搬移内核,将设备树传递给内核,加载文件系统

    显示开机画面,部分硬件初始化(串口、网络接口等)

  4. 内核:设备树加载,其他外设初始化,挂载文件系统,执行init进程

    MMU和Cache,中断控制器和调度器

系统启动流程:

5.什么是bootloader

5.1概念

简单地说,Bootloader 就是在操作系统内核运行之前运行的一段程序,它类似于 PC 机中的 BIOS 程序。通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射图的功能,从而将系统的软硬件环境带到一个合适的状态,为最终调用系统内核做好准备。


通常,Bootloader 是严重地依赖于硬件实现的,特别是在嵌入式中。因此,在嵌入式世界里建立一个通用的 Bootloader 几乎是不可能的。尽管如此,仍然可以对 Bootloader 归纳出一些通用的概念来指导用户特定的 Bootloader 设计与实现。

5.2Bootloader 所支持的 CPU 和嵌入式开发板

每种不同的 CPU 体系结构都有不同的 Bootloader。有些 Bootloader 也支持多种体系结构的 CPU,如后面要介绍的 U-Boot 就同时支持 ARM 体系结构和 MIPS 体系结构。除了依赖于 CPU 的体系结构外,Bootloader 实际上也依赖于具体的嵌入式板级设备的配置。

5.3Bootloader 的安装媒介

系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如 ROM、EEPROM或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行Bootloader 程序。

5.4启动过程分为单阶段和多阶段

Bootloader 的启动过程分为单阶段和多阶段两种。通常多阶段的 Bootloader 能提供更为复杂的功能,以及更好的可移植性。

5.5Bootloader 的操作模式

Bootloader 的操作模式。大多数 Bootloader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。

  • 启动加载模式:这种模式也称为"自主"模式。也就是 Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是嵌入式产品发布时的通用模式。
  • 下载模式:在这种模式下,目标机上的 Bootloader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Bootloader 保存到目标机的 RAM 中,然后再被 Bootloader 写到目标机上的FLASH 类固态存储设备中。Bootloader 的这种模系统是在更新时使用。工作于这种模式下的Bootloader 通常都会向它的终端用户提供一个简单的命令行接口。

5.6Bootloader 与主机之间进行文件传输所用的通信设备及协议

Bootloader 与主机之间进行文件传输所用的通信设备及协议,最常见的情况就是,目标机上的 Bootloader 通过串口与主机之间进行文件传输,传输协议通常是 xmodem/ymodem/zmodem 协议中的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借助 TFTP 协议来下载文件是个更好的选择。

6.Bootloader 启动流程

Bootloader 的启动流程一般分为两个阶段:stage1 和 stage2,下面分别对这两个阶段进 行讲解:

6.1Bootloader 的 stage1

在 stage1 中 Bootloader 主要完成以下工作

  • 基本的硬件初始化,包括屏蔽所有的中断、设置 CPU 的速度和时钟频率、RAM 初始 化、初始化 LED、关闭 CPU 内部指令和数据 cache 等。
  • 为加载 stage2 准备 RAM 空间,通常为了获得更快的执行速度,通常把 stage2 加载到 RAM 空间中来执行,因此必须为加载 Bootloader 的 stage2 准备好一段可用的 RAM 空间范围。
  • 拷贝 stage2 到 RAM 中,在这里要确定两点:①stage2 的可执行映像在固态存储设备 的存放起始地址和终止地址;②RAM 空间的起始地址。
  • 设置堆栈指针 sp,这是为执行 stage2 的 C 语言代码做好准备。

6.2Bootloader 的 stage2

在 stage2 中 Bootloader 主要完成以下工作。

  • 用汇编语言跳转到 main 入口函数

    由于 stage2 的代码通常用 C 语言来实现,目的是实现更复杂的功能和取得更好的代码可 读性和可移植性。但是与普通 C 语言应用程序不同的是,在编译和链接 Bootloader 这样的程 序时,不能使用 glibc 库中的任何支持函数。

  • 初始化本阶段要使用到的硬件设备,包括初始化串口、初始化计时器等。在初始化这 些设备之前、可以输出一些打印信息。

  • 检测系统的内存映射,所谓内存映射就是指在整个 4GB 物理地址空间中有指出哪些 地址范围被分配用来寻址系统的 RAM 单元。

  • 加载内核映像和根文件系统映像,这里包括规划内存占用的布局和从 Flash 上拷贝数 据

  • 设置内核的启动参数。

7.Bootloader 的种类

嵌入式系统世界已经有各种各样的 Bootloader,种类划分也有多种方式。除了按照处理 器体系结构不同划分以外,还有功能复杂程度的不同。

区分"Bootloader"和"Monitor"的概念:

  • "Bootloader"只是引导设备并且执行主程序的固件
  • "Monitor"还提供了更多的命令行接口,可以进行调试、读写内存、烧写 Flash、配置环境变量等。
  • "Monitor"在嵌入式系统开发过程中可以提供很好的调试功能,开发完成以后,就完全设置成了一个"Bootloader"。所以,习惯上大家把它们统称为 Bootloader。

下表列出了 Linux 的开放源码引导程序及其支持的体系结构。表中给出了 X86、ARM、 PowerPC 体系结构的常用引导程序,并且注明了每一种引导程序是不是"Monitor"。

Bootloader Monitor 描述 X86 ARM PowerPC
LILO Linux 磁盘引导程序
GRUB GNU 的 LILO 替代程序
Loadlin 从 DOS 引导 Linux
ROLO 从 ROM 引导 Linux 而不需要 BIOS
Etherboot 通过以太网卡启动 Linux 系统的固件
LinuxBIOS 完全替代 BUIS 的 Linux 引导程序
BLOB LART 等硬件平台的引导程序
U-Boot 通用引导程序
RedBoot 基于 eCos 的引导程序

8.U-Boot

8.1U-Boot(UniversalBootloader),是遵循 GPL 条款的开放源码项目。它是从 FADSROM、 8xxROM、PPCBOOT 逐步发展演化而来。

其源码目录、编译形式与 Linux 内核很相似,事实上,不少 U-Boot 源码就是相应的 Linux 内核源程序的简化,尤其是一些设备的驱动程序,这从 U-Boot 源码的注释中能体现这一点。

  • U-Boot 不仅仅支持嵌入式 Linux 系统的引导,而且还支持 NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS 嵌入式操作系统。其目前要支持的目标操作系统是 OpenBSD、NetBSD、FreeBSD、4.4BSD、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、VxWorks,LynxOS、pSOS、QNX、RTEMS、ARTOS。
  • 这是 U-Boot 中 Universal 的一层含义,另外一层含义则是 U-Boot 除了支持 PowerPC 系列的处 理器外,还能支持 MIPS、x86、ARM、NIOS、XScale 等诸多常用系列的处理器。
  • 这两个特点正是 U-Boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前为止,U-Boot 对 PowerPC 系列处理器支持最为丰富,对 Linux 的支持最完善。

8.2U-Boot 的特点

  • 开放源码
  • 支持多种嵌入式操作系统内核,如 Linux、NetBSD、VxWorks、QNX、RTEMS、 ARTOS、LynxOS
  • 支持多个处理器系列,如 PowerPC、ARM、x86、MIPS、XScale;
  • 较高的可靠性和稳定性;
  • 高度灵活的功能设置,适合 U-Boot 调试,操作系统不同引导要求,产品发布等;
  • 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、 EEPROM、RTC、键盘等;
  • 较为丰富的开发调试文档与强大的网络技术支持。

8.3U-Boot 可支持的主要功能

  • 系统引导:支持 NFS 挂载、RAMDISK(压缩或非压缩)形式的根文件系统。支持 NFS 挂载,并从 FLASH 中引导压缩或非压缩系统内核。

  • 基本辅助功能:强大的操作系统接口功能;

    可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤其对 Linux 支持最为强劲;

    支持目标板环境参数多种存储方式,如 FLASH、NVRAM、EEPROMCRC32 校验,可校验FLASH 中内核、RAMDISK 镜像文件是否完好。

  • 设备驱动:串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC 等驱动支持。

  • 上电自检功能:SDRAM、FLASH 大小自动检测;SDRAM 故障检测;CPU 型号

  • 特殊功能:XIP 内核引导。

9.U-Boot相关指令

9.1基础

  1. help :查看u-boot支持的所有的命令

  2. loadb :下载二进制文件到addr地址中

  3. go :在addr地址中启动应用程序

  4. gpio

    gpio引脚控制的命令gpio <input|set|clear|toggle> <pin>

    input : 引脚输入

    set : 引脚输出高电平

    clear : 引脚输出低电平

    toggle : 引脚的输出状态翻转

    <pin> : 哪个gpio引脚 gpioxy (x=a-k,z) (y=0-15)

  5. gpio status :查看哪个组的 gpioa-gpiok,gpioz

    -a : 查看所有额引脚的状态

    <bank> : 查看哪个组的 gpioa-gpiok,gpioz

    <pin> : 查看哪个引脚的状态 gpioxy (x=a-k,z) (y=0-15)

9.2环境变量

打印u-boot环境变量的命令

用法:

printenv ---> 打印u-boot中所有的环境变量

printenv u-boot环境变量名 ---> 打印某个环境变量的值

u-boot中比较重要的几个环境变量:

arch=arm ---> 架构

baudrate=115200 ---> 串口的波特率

bootdelay=1 ---> u-boot启动倒计时的时间

bootcmd="" ---> 自启动的命令,后边详细讲解 //当uboot倒计时结束后自动执行这个环境变量保存的命令

bootargs="" ---> 自启动的参数,后边详细讲解 //自启动命令执行后传递给自启动模式的参数

serverip=192.168.1.250 --> 指定ubuntu系统的IP地址

ipaddr=192.168.1.222 --> 指定板子的IP地址

netmask=255.255.255.0 --> 子网掩码

gatewayip=192.168.1.1 --> 网关

Environment size: 4138/8187 bytes --> u-boot环境变量的大小。

u-boot在匹配u-boot命令时,是部分单词匹配,

因此打印u-boot环境变量可以使用printenv/print/pri

setenv /env set:设置环境变量,设置环境变量时,默认修改的时内存中的环境变量。

saveenv /env save :保存环境变量,将内存中的环境变量保存到flash中。

env :u-boot环境变量设置的命令

cpp 复制代码
用法:
env default -a ---> 恢复默认的环境变量
env print ---> 打印环境变量,等价于printenv
env set ---> 设置环境变量,等价于setenv
env save ---> 保存环境变量,等价于saveenv

9.3环境变量bootcmd :

存储一段自动执行的命令序列 ,当 U-Boot 启动倒计时结束(未被用户打断)时,会自动执行 bootcmd 中的命令,最终完成内核的加载和启动。

  • 查看当前 bootcmdprintenv bootcmd
  • 修改 bootcmdsetenv bootcmd "新的命令序列"
  • 保存修改(掉电不丢失):saveenv

9.4环境变量bootargs:

U-Boot 传递给 Linux 内核的启动参数列表,内核启动时会解析这些参数,从而确定自身的运行配置(如根文件系统位置、控制台设备、调试模式等)

核心功能

告诉内核:"启动后应该如何运行",例如:

  • 根文件系统(rootfs)的位置(是在 MMC 卡、NAND 还是网络?);
  • 控制台输出设备(如串口 ttyS0)及波特率;
  • 是否以只读 / 读写模式挂载根文件系统;
  • 内核调试信息的输出级别等。

run bootcmd:手动执行 bootcmd环境变量中定义的命令序列

9.5部署相关

ping :测试开发板是否可以ping通ubuntu

tftpboot /tftp :使用tftp命令下载程序到ubuntu中

tftp/tftpboot 下载的地址 下载的文件名


01.bootm:是用于启动存储在内存中的操作系统镜像(如 Linux 内核)的核心指令

功能:****bootm的核心作用是启动已加载到内存中的内核镜像(通常是经过 U-Boot 打包的

uImage格式),同时支持传递设备树(Device Tree Blob, DTB)和根文件系统(initrd)等辅助文件,确保内核能正确识别硬件并启动。

语法:

cpp 复制代码
bootm [addr [initrd[:size]] [fdt]]
  • <addr>:必选参数,内核镜像在内存中的起始地址(如0x80800000)。
  • [initrd[:size]]:可选参数,初始根文件系统(initrd/initramfs)在内存中的地址;:size可指定其大小(若不指定,U-Boot 会自动检测)。
  • [fdt]:可选参数,设备树(DTB)在内存中的地址,用于向内核传递硬件信息(ARM 架构常用)。

02.mmc part:显示 MMC 设备的分区表

功能:列出当前选中的 MMC 设备上的分区信息(分区号、起始扇区、大小等)。

语法:

cpp 复制代码
mmc part [dev]

dev\]:可选参数,指定要查看的 MMC 设备编号(默认查看当前选中的设备)。 *** ** * ** *** #### 03.mmc dev:切换或显示当前 MMC 设备 **功能**:指定当前操作的 MMC 设备(如多个 SD 卡槽或 eMMC 芯片),或显示当前选中的设备。 **语法:** ```cpp mmc dev [dev] [part] ``` * `[dev]`:可选参数,MMC 设备编号(从 0 开始,如 0、1,对应不同的物理设备)。 * `[part]`:可选参数,指定该设备上的分区编号(若不指定,默认操作整个设备)。 *** ** * ** *** #### 04.mmc read:从 MMC 设备读取数据到内存 **功能**:将 MMC 设备中指定扇区的数据读取到内存的指定地址,常用于加载内核、设备树等镜像到内存准备启动。 **语法:** **bash** ```cpp mmc read - ``:目标内存地址(如 0x80000000,需是 CPU 可访问的 RAM 地址)。 - ``:MMC 设备上的起始扇区号(从 0 开始)。 - ``:要读取的扇区数量(1 扇区通常为 512 字节)。 ``` *** ** * ** *** #### 05.mmc write:将内存数据写入 MMC 设备 **功能**:将内存中指定地址的数据写入 MMC 设备的指定扇区,常用于烧写镜像(如内核、根文件系统)到存储设备。 **语法:** **bash** ```cpp mmc write :源数据在内存中的地址。 :MMC 设备上的目标起始扇区号。 :要写入的扇区数量。 ``` *** ** * ** *** #### 06.mmc erase:擦除 MMC 设备(如 SD 卡、eMMC)上指定范围的扇区数据,是对存储设备进行 "清空" 操作的核心指令 **功能:**将 MMC 设备中从指定起始扇区开始的连续多个扇区数据彻底清除(通常会被填充为 0 或特定擦除标记),适用于清理分区、准备新的存储区域或恢复设备初始状态等场景。 **语法:** ```cpp mmc erase - ``:必选参数,要擦除的**起始扇区号**(从 0 开始计数)。 - ``:必选参数,要擦除的**扇区数量**(1 扇区通常为 512 字节,具体取决于设备)。 ``` *** ** * ** ***

10.1开发阶段部署

10.2网络设置:

cpp 复制代码
#环境变量初始化
env default -a
#设置通用的Mac地址,无法连接网络再设置这个
setenv ethaddr 00:01:1f:34:ee:f1

#需要设置u-boot中的serverip ipaddr netmask gatewayip环境变量。
#设置开发板u-boot的ip地址:
setenv serverip 192.168.1.250
setenv ipaddr 192.168.1.10
setenv netmask 255.255.255.0
setenv gatewayip 192.168.1.1
saveenv
#注:开发板的IP地址的网段必须和ubuntu系统的网段在同一个网段之上。

10.3部署:

cpp 复制代码
#测试网络
ping 192.168.1.250

#设置系统启动参数
#root=/dev/nfs ---> 使用nfs服务的方式挂载根文件系统
#nfsroot=192.168.1.250:/home/linux/nfs/rootfs--> 网络文件系统的IP地址和路径
#rw ---> 对根文件系统具有可读可写的权限
#console=ttySTM0,115200--> 使用的串口为ttySTM0,波特率为115200
#init=/linuxrc --> linux系统启动成功之后,运行的1号进程linuxrc
#ip=192.168.1.10 --> 指定开发板的IP地址,需要修改为自己的地址
setenv bootargs root=/dev/nfs nfsroot=192.168.1.250:/home/lily/nfs/rootfs,tcp,v4 rw console=ttySTM0,115200 init=/linuxrc ip=192.168.1.10

#设置系统启动指令
#tftp 0xc2000000 uImage → 下载内核到指定内存地址
#tftp 0xc4000000 stm32mp157a-fsmp1a.dtb → 下载设备树到指定内存地址
#bootm 0xc2000000 - 0xc4000000
setenv bootcmd "tftp 0xc2000000 uImage;tftp 0xc4000000 stm32mp157a-fsmp1a.dtb;bootm 0xc2000000 - 0xc4000000"

#保存环境变量
saveenv

#系统复位

10.4产品阶段部署

10.5MMC区域划分:

部署:

cpp 复制代码
#切换MMC设备为SD卡(0)。设备emmc(1)
mmc dev 0

#从TFTP服务中下载内核镜像
tftp 0xc2000000 uImage
#将内存0xc2000000地址的0x4000个块(512字节)写入MMC的0x2000这片地址
mmc write 0xc2000000 0x2000 0x4000

#从TFTP服务中下载设备树
tftp 0xc4000000 stm32mp157a-fsmp1a.dtb
#将内存中数据写入MMC
mmc write 0xc4000000 0x8000 0x200

#从TFTP服务中下载文件系统镜像
tftp 0xc6000000 ramdisk.img
#将内存中数据写入MMC
mmc write 0xc6000000 0x30000 0x8000

#设置系统启动参数
#root=/dev/ram --> 从内存中挂载跟文件系统
#console=ttySTM0,115200 --> 串口及串口的波特率
#initrd=0xc5000040,0x1000000 --> 根文件系统的地址,跟文件系统的大小(以字节为单位)
	#ramdisk.img镜像文件在跟文件系统的位置为0xc5000000。加上0x40目的是为了跳过64字节的文件头。
#rw --> 可读可写的权限
#init=/linuxrc --> 系统启动之后运行的1号进程
#rootfstypes=ext4 --> 跟文件系统的类型为ext4
setenv bootargs root=/dev/ram console=ttySTM0,115200 initrd=0xc6000040,0x1000000 rw init=/linuxrc rootfstypes=ext4

#设置系统启动指令
#mmc dev 0 → 切换MMC设备
#mmc read 0xc2000000 0x2000 0x4000;mmc read 0xc4000000 0x8000 0x200;mmc read 0xc6000000 0x30000 0x8000 → 从MMC设备读取数据到内存
#bootm 0xc2000000 0xc6000000 0xc4000000 → 从指定地址启动系统镜像
setenv bootcmd "mmc dev 0;mmc read 0xc2000000 0x2000 0x4000;mmc read 0xc4000000 0x8000 0x200;mmc read 0xc6000000 0x30000 0x8000;bootm 0xc2000000 0xc6000000 0xc4000000"

#保存环境变量
saveenv

#系统复位
相关推荐
小狗爱吃黄桃罐头3 小时前
正点原子【第四期】Linux之驱动开发学习笔记-5.1 设备树下的LED驱动实验
linux·驱动开发·学习
桥边驿语人3 小时前
Docker 容器无法访问外网的问题排查与解决指南
运维·docker·容器
ZStack开发者社区3 小时前
ZStack Cloud v5.4.0 LTS让运维自动驾驶,让合规开箱即用
运维·云计算
叶凡要飞3 小时前
linux安装google chrome 谷歌浏览器
linux·运维·chrome
清静诗意3 小时前
在 Ubuntu 上通过 Docker 与 Docker Compose 部署项目的完整指南
linux·ubuntu·docker
企鹅虎4 小时前
linux内核驱动开发视频课程
linux
专注VB编程开发20年4 小时前
vb.net编写DDE(Dynamic Data Exchange)服务器
运维·服务器·github·vb.net·dde
Clownseven4 小时前
如何用Fail2ban保护Linux服务器?防止SSH暴力破解教程
linux·服务器·ssh
源码部署25 小时前
linux内核驱动开发视频课程
linux