其中,10.1.1。*是您网络段的地址信息。
最后重新启动NFS
sudo systemctl restart nfs-kernel-server
测试NFS的安装
安装完成后,您可以安装NFS客户端
sudo apt install nfs-common
然后创建一个本地文件夹目录
sudo mkdir -p /opt/nfs-client
终于安装了
sudo mount -t nfs 10.1.1.160:/opt/nfs /opt/nfs-client
在 /opt /nfs下创建文件时,也可以看到 /opt /nfs-client目录,表明成功。
2.2 Raspberry Pi开发环境构建2.2.1硬件连接
Raspberry Pi 4上的实际硬件引脚分布显示在上图中,其中需要连接串行端口RX,TX和GND。
准备一个超过8G的SD卡,然后打开Raspberry Pi成像仪,然后选择Raspberry Pi图像将其燃烧。
此步骤的目的是因为Raspberry Pi启动过程需要从SD卡加载启动文件的第一阶段。
默认情况下,连接到串行端口后,燃烧的固件没有输出。您需要自己修改SD卡中的config.txt文件。最后添加以下句子。
enable_uart=1
这样,通过MobaxTerm工具打开串行端口并连接到电源后,您可以看到以下输出
然后输入用户名和密码如下
raspberrypi login:pi
Password:raspberry
这样,您可以使用默认的Raspberry Pi 4串行调试功能。
2.2.2覆盆子PI 4B启动过程分析
为了简要描述Raspberry Pi 4B的启动过程,电源后,Raspberry Pi将自动加载位于SD卡文件中的bootcode.bin文件。该文件被加载到Raspberry Pi的GPU中。该程序初始化PLL,DDR等,然后在SD卡文件中读取start4.elf文件以执行。在执行文件期间,将读取config.txt文件,并且可以根据配置脚本选择可以执行的固件。
在嵌入式开发中,基础启动逻辑必须非常清楚,以便在任何情况下都可以解决问题,从而确保在硬件和软件级别上保持一致性。
上图基本上显示了一个通用嵌入的Linux启动过程,每个阶段的特征和功能点得到很好的描述。
Raspberry Pi 4b上Broadcom BCM2711的启动遵循以下程序。
第一阶段引导程序:
第二阶段引导加载程序:
在本文中,我们主要修改config.txt配置文件以执行UBOOT启动过程。
3。安装交叉兼容工具和层压工具的编译3.1安装ARM 64位交叉补偿环境
由于需要编译64位程序,因此我们需要安装ARM的64位交叉补偿环境。
https://www.linaro.org/downloads/
从上面的网站输入
建议下载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
在最后添加以下内容
alias 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-'
更新环境
source ~/.bashrc
3.2在Raspberry pi上编译UBOOT
首先,您需要下载代码
git clone https://github.com/u-boot/u-boot.git
正常的下载完成图如下:
然后切换分支并开始编译。
cd u-boot
git checkout v2020.04-rc3
编译之前,您需要首先安装所需的编译程序
sudo apt install u-boot-tools bison bc make flex libssl-dev ncurses-*
安装完成后,执行
crosscompiler
此命令是在环境变量中定义的命令,您可以设置环境变量。
make rpi_4_defconfig
只需使用默认配置进行编译即可。
make -j $(nproc)
编译后的Uboot.bin文件是可以直接在Raspberry Pi 4B上执行的程序。
3.3将U-Boot放在Raspberry Pi上运行
此时,您可以将编译的U-Boot程序在Raspberry Pi 4B上运行。
将Raspberry Pi的SD卡插入计算机,然后在SD卡中的Config.txt.bak中重新命令config.txt。并创建新的config.txt。
arm_control=0x200
kernel=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。linux编译和下载Raspberry Pi 4b 4.1编译Raspberry Pi Linux源代码
Raspberry Pi 4B的施托功能已经完成,我们将开始编译Raspberry Pi的Linux内核。
Raspberry Pi有一个单独的代码分支可以维护Linux,可以通过以下命令下载。
git clone --branch rpi-5.6.y https://github.com/raspberrypi/linux
输入Linux目录
创建一个新目录来存储编译的固件
mkdir rpi_hw
开始汇编
make O=rpi_hw bcm2711_defconfig
删除MMC/SD/SDIO驱动程序
make O=rpi_hw menuconfig
输入设备驱动程序,然后选择以删除MMC/SD/SDIO卡支持。
保存配置后,您可以编译。
make 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命令,您可以看到Raspberry Pi 4b上有两家银行。第一银行位于0x00000000,第二个银行为0x400000000。
和Raspberry Pi 4B从SD卡加载图像文件时,开始在DRAM的0x8000的地址运行。
当然,该地址也可以在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 kernel Image
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中的路径。
setenv nfsroot /opt/nfs/
设置启动参数
setenv bootargs "console=ttyAMA0,115200 root=/dev/nfs rw nfsroot=${serverip}:${nfsroot},v3,tcp ip=$ipaddr:$serverip::$netmask::eth0:off"
保存配置
saveenv
5.2插入SD卡并将其挂在虚拟机上
首先将USB驱动器安装到虚拟机
您可以看到两个磁盘出现
在:
您可以将rootf中的所有文件复制到/opt/nfs/
sudo cp * /opt/nfs/ -R
在 /opt /nfs目录中,创建一个新的文件文件夹,然后将启动中的所有文件复制到其中。
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 defaults,vers=4.1,proto=tcp 0 0
目的是阻止默认的两个项目列表,您只需要将文件系统安装在NFS中即可。
修改完成后,插入SD卡,您可以正常从TFTP获取Linux的内核固件,然后从NFS文件系统安装根文件系统。
如果您发现需要密码,或者忘记了密码,则可以输入
cd /opt/nfs/
sudo vim /etc/passwd
删除中间x。
在Linux中,默认X表示需要输入密码。
6。摘要
本文对Raspberry Pi的整个Linux系统和Raspberry Pi的启动进行了一定的分析。我们在Raspberry Pi,U-Boot Loading Linux内核和安装NFS文件系统的启动下进行了一些实验。
制作自己的根文件系统的最后一部分使用Raspberry Pi的默认根文件系统。如果您需要自己剪裁并制作,则可以执行自定义操作。
可以在Raspberry Pi 4B上对整个嵌入的Linux开发和环境构建过程进行很好的测试,并且永远不会与本质分开。它掌握了嵌入式开发的过程和工具,并且在应用程序和驱动程序开发方面非常方便和有效。
由于时间限制,仍然有一些尚未完成的实验,例如Linux,驱动程序开发等上的应用程序开发以及JLINK调试等。
在Raspberry Pi 4B上使用和启动Linux非常方便,而且价格非常合理。这是一个很好的开发平台。