首页 » 科学 » 嵌入式 linux 开拓_文件_加载

嵌入式 linux 开拓_文件_加载

雨夜梧桐 2025-01-10 23:09:45 0

扫一扫用手机浏览

文章目录 [+]

末了重启 nfs

sudo systemctl 重新启动 nfs 内查究事器

嵌入式 linux 开拓_文件_加载 嵌入式 linux 开拓_文件_加载 科学

测试nfs的安装

嵌入式 linux 开拓_文件_加载 嵌入式 linux 开拓_文件_加载 科学
(图片来自网络侵删)

安装完成后就可以安装nfs客户端了

sudo apt 安装 nfs-common

然后创建本地文件夹目录

sudo mkdir -p /opt/nfs-客户端

末了,安装它

sudo mount -t nfs 10.1.1.160:/opt/nfs /opt/nfs-客户端

当/opt/nfs下创建文件之后,也可以看到/opt/nfs-client目录,解释成功。

2.2 树莓派开拓环境搭建

2.2.1 硬件连接

树莓派4上实际硬件引脚分布如上图,个中须要连接串口RX、TX、GND。

准备一张8GB以上的SD卡,然后打开Raspberry Pi Imager,选择要刻​​录到个中的Raspberry Pi镜像。

这一步的目的是由于Raspberry Pi启动过程须要从SD卡加载第一阶段启动文件。

默认情形下,烧写的固件连接串口后是没有任何输出的,须要自行修正SD卡里的config.txt文件,在末了添加下面这句话就可以了。

启用_uart=1

这样通过mobaxterm工具打开串口,接上电源之后就可以看到如下输出

然后输入用户名和密码如下

raspberrypi 登录名:pi 密码:raspberry

这样就可以利用默认的Raspberry Pi 4串口调试功能了。

2.2.2 树莓派4b启动过程剖析

大略说一下树莓派4b的启动过程,上电后树莓派会自动加载位于SD卡文件中的bootcode.bin文件,这个文件加载到树莓派的GPU中运行,程序初始化PLL,DDR等,然后读取SD卡文件中的start4.elf文件实行,这个文件实行过程中会读取config.txt文件,根据配置脚本选择可实行固件。

做嵌入式开拓的时候,底层的启动逻辑必须非常清楚,这样无论如何都能理清问题,从而担保硬件和软件层面的同等性。

上图基本展示了一个通用的嵌入式Linux启动过程,并且很好的描述了各个阶段的特点和功能点。

Broadcom BCM2711 在 Raspberry Pi 4b 上的启动过程遵照以下步骤。

第一阶段勾引加载程序:

第一阶段BootROM一样平常嵌入在芯片中,在GPU中实行,而ARM内核处于复位状态。

树莓派4b的BootROM是通过EEPROM来加载的,4b之前都是SD卡上的bootcode.bin文件。

第二阶段勾引加载程序:

此阶段的启动固件从 SD 卡、网络、USB 等加载。

在 Raspberry Pi 4 上,利用 SD 卡中的 start.elf 二进制文件。

start.elf文件在SD文件系统中找到config.txt文件,然后根据个中的信息进行启动过程的处理。

本文紧张通过修正config.txt配置文件来进行uboot的启动流程。

3.交叉编译工具的安装及uboot的编译

3.1 安装arm 64位交叉编译环境

由于须要编译64位的程序,以是这里须要安装arm 64位的交叉编译环境。

从上述网站进入

建议下载gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz。

下载完成后,移动到指定目录。

#创建文件夹sudo mkdir -p /opt/linaro #解压到指定文件夹路径sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C /opt/linaro

更新环境变量

sudo vim〜/ .bashrc

在末了添加以下内容

别名 crosscompiler='export KERNEL=kernel8;export ARCH=arm64;export CROSS_COMPILE=/opt/linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-'

更新环境

源 ~/.bashrc

3.2 在树莓派上编译uboot

首先你须要下载代码

git 克隆

正常下载完成图如下:

然后切换分支并开始编译。

cd u-boot git checkout v2020.04-rc3

编译之前,首先须要安装编译所需的程序

sudo apt 安装 u-boot-tools bison bc make flex libssl-dev ncurses-

安装完成后,实行

交叉编译器

该命令定义在环境变量中,可以设置环境变量。

制作 rpi_4_defconfig

只需利用默认配置进行编译。

制作-j $(nproc)

编译后的uboot.bin文件是可以在Raspberry Pi 4b上直接实行的程序。

3.3 在树莓派上运行u-boot

到这一步就可以把编译好的u-boot程序放到Raspberry Pi 4b上并运行了。

将树莓派的SD卡插入电脑,将SD卡里的config.txt重命名为config.txt.bak,并新建一个config.txt。

arm_control=0x200 内核=u-boot.bin dtoverlay=disable-bt

这三行意思是

arm_control=0x200 #由于树莓派4b支持64位架构,以是这个用来表示运行64位程序

利用 uboot

kernel=u-boot.bin # kernel表示正在运行的固件

启用串行端口

dtoverlay=disable-bt #设计树莓派4时,如果打开串口调试,则无法利用蓝牙

将SD卡插入电脑,可以看到uboot正常启动。

4.树莓派4b上Linux编译下载

4.1 编译Raspberry Pi Linux 源代码

树莓派4b的uboot功能已经完成,接下来我们开始编译树莓派的Linux内核。

Raspberry Pi有单独掩护的Linux代码分支,可以利用以下命令下载。

git 克隆--分支 rpi-5.6.y

进入Linux目录

新建目录,用于存放编译好的固件

创建目录 rpi_hw

开始编译

使 O=rpi_hw bcm2711_defconfig

删除 MMC/SD/SDIO 驱动程序

使 O=rpi_hw 菜单配置

进入设备驱动程序并选择删除 MMC/SD/SDIO 卡支持。

保存配置后,就可以编译了。

使 O=rpi_hw -j $(nproc)

为什么我们该当删除 MMC/SD/SDIO 驱动程序?

这是由于须要编译从网络启动的驱动,以是不须要在Raspberry Pi的SD卡上进行操作。

编译完成后,可以在rpi_hw/arch/arm64/boot中找到编译好的文件。

将编译好的Linux内核文件放入

sudo cp rpi_hw/arch/arm64/boot/Image /srv/tftp/

4.2 运行编译好的Linux固件

当通过uboot将编译好的固件加载到RAM中并运行时,首先须要理解Raspberry Pi 4b的内存分布情形。

通过uboot中的bdinfo命令可以看到树莓派4b上有两个bank,第一个bank在0x00000000,第二个bank在0x40000000。

当Raspberry Pi 4b从SD卡加载Image文件时,它会被加载到地址0x8000的DRAM中并开始运行。

当然也可以在uboot中设置地址,Linux会重新定位代码。

此时须要在uboot中设置启动信息。

首先设置uboot的静态IP地址

setenv ipaddr 10.1.1.100 #设置开拓板静态地址(自定义) setenv serverip 10.1.1.160 #设置做事器地址 setenv netmask 255.255.255.0 saveenv reset

以上操作设置了IP地址,接下来设置启动

setenv kernel_addr_r 0x8000 setenv 内核映像 setenv netboot 'tftp ${kernel_addr_r} ${kernel} && booti ${kernel_addr_r} - ${fdtcontroladdr}' setenv bootcmd 'run netboot' setenv bootargs 'console=ttyAMA0' saveenv reset

可以显示如下:

上次启动后出错

这是正常的,目前没有rootfs。
但现在Linux内核可以正常加载和调试。

接下来,将其挂载到 rootfs 上。

5. 根文件的利用

本文将不谈论制作通用根文件系统的过程,而将重点描述如何利用它。

5.1 在uboot中设置启动项

首先在uboot中设置路径。

设置环境 nfsroot /opt/nfs/

设置启动参数

setenv bootargs“掌握台=ttyAMA0,115200 root=/dev/nfs rw nfsroot=${serverip}:${nfsroot},v3,tcp ip=$ipaddr:$serverip::$netmask:off”

保存配置

保存环境变量

5.2 插入SD卡并挂载到虚拟机

首先,将 USB 驱动器挂载到虚拟机

可以看到涌现了两个磁盘

在:

rootfs 是 Linux 根文件系统

boot 是一个可以在 Windows 上访问的 ext32 文件

您可以将 rootfs 中的所有文件复制到 /opt/nfs/

sudo cp /opt/nfs/ -R

在/opt/nfs目录下新建一个文件夹,将boot里的所有文件复制到个中。

sudo mkdir -p /opt/nfs/file sudo cp /opt/nfs/file/

5.3 修正文件脚本

须要修正

sudo vim etc/fstab

添加以下文件

10.1.1.160:/opt/nfs/file /boot nfs 默认值,vers=4.1,proto=tcp 0 0

其目的是为了屏蔽默认的二项列表,只须要在nfs中挂载文件系统即可。

修正完之后,插入SD卡,就可以正常从tftp获取Linux内核固件,从nfs文件系统挂载根文件系统。

如果您创造须要密码,或者您忘却了密码,您可以输入

cd /opt/nfs/ sudo vim /etc/passwd

删除中间的 x。

在Linux中,默认的x表示须要密码才能进入。

6. 总结

本文对树莓派的全体Linux系统环境以及树莓派的启动进行了剖析,并对树莓派的开机勾引、u-boot加载Linux内核、挂载nfs文件系统等做了一些实验。

末了一部分制作自己的根文件系统,这里用的是树莓派默认的根文件系统,如果须要自己裁剪制作,可以自定义。

全体嵌入式Linux开拓和环境搭建流程可以在Raspberry Pi 4b上得到很好的测试,节制了嵌入式开拓的流程和工具之后,开拓运用程序和驱动会非常方便、高效。

由于韶光关系,有些实验还没有完成,比如Linux上的运用程序开拓,驱动开拓,jlink调试等。

在Raspberry Pi 4b长进修如何利用和启动Linux非常方便,而且价格也很合理。
这是一个很好的开拓平台。

原标题:详解树莓派4嵌入式Linux开拓流程

标签:

相关文章

I2C通信没反应怎么办?_总线_主机

这个时候,就须要我们理解I2C的通信时序,我们可以通过示波器抓取通信的波形,看是否知足通信时序哀求,主机有没有发送数据?I2C通信...

科学 2025-01-12 阅读0 评论0