1.安装环境及软件版本:
虚拟机:Ubuntu 18.04 (之前使用ubuntu16.04编译时,提示libc库版本低)
交叉编译器:gcc-linaro-10.2.1-2021.02-x86_64_aarch64-linux-gnu.tar.xz
下载地址:https://snapshots.linaro.org/gnu-toolchain/10.2-2021.02-1/aarch64-linux-gnu/
Uboot:u-boot-2021.04.tar.bz2
下载地址:ftp://ftp.denx.de/pub/u-boot/
2.交叉编译器安装
将工具链解压安装到了/usr/local/arm64下, 如果在local目录下不存在arm64目录,需要手动的创建sudo mkdir arm64。进入/usr/local/arm64 目录下,执行sudo tar –vxf 命令解压。
添加安装路径到PATH环境变量中,编辑/etc/profile文件。
# sudo vim /etc/profile
在文件最后一行加上:export PATH=$PATH: /usr/local/arm64/gcc-linaro-10.2.1-2021.02-x86_64_aarch64-linux-gnu/bin
注:修改文件后要想马上生效还要运行# source /etc/profile 不然只能在下次重进此用户时生效。
3.编译Uboot
将uboot解压安装到了/usr/local/uboot下:
.tar.bz2 格式解压命令为 tar –jxvf xx.tar.bz2
查看uboot对于树莓派4b的支持情况,在configs目录下输入:ls | grep rpi,其中rpi_4_defconfig是树莓派4b 64位的默认配置选项。
编译命令:
export ARCH=arm
export CROSS_COMPILE=aarch64-linux-gnu-
sudo make rpi_4_defconfig
sudo make
在编译过程中,如果有bison: not found等报错,需要手动安装相应的包。
4.固件下载与使用
当制作好树莓派的sd卡启动盘后,需要将u-boot.bin放到sd卡中并且修改config.txt
文件如下:
enable_uart=1
arm_64bit=1
kernel_addr=0x80000
kernel=u-boot.bin
core_freq=250
将sd卡启动盘放到树莓派中,用串口工具连接树莓派串口引脚, 接着就可以进行上电操作。此时,uboot就可以正常运行了.
5.从uboot通过tftp来引导执行rpios
- 编译rpios(裸机操作系统),配置链接脚本运行地址为. = 0x200000;
- 在windows下载tftp,开启TFTP服务器:
3.设置环境变量,配置ipaddr和serverip。
4.使用tftp加载内核到内存,tftp 0x200000 kernel8.img,启动内核,go 0x200000. 但运行时报指令未定义的错误.
后来了解到目前uboot中已经开启了dcache,这里涉及CPU的icache和dcache同步问题。由于程序运行时,指令流都流过icache,而指令中涉及到的数据流经过dcache。所以对于自修改的代码而言,比如我们修改了内存p这个位置的代码,这个时候我们是通过store的方式去写的p,所以新的指令会进入dcache。但是我们接下来去执行p位置的指令的时候,icache里面可能命中的是修改之前的指令。下面借用宋老师的图说明下:
所以这个时候软件需要把dcache的东西clean出去,然后让icache invalidate。测试发现发现加上刷新dcache后就好了。
sudo make rpi_4_defconfig后,接着输入make menuconfig,开启dcache的命令。
使用新的uboot后,依次输入以下命令:tftp 0x200000 kernel8.img;dcache flush;(刷新dcache);go 0x200000(启动内核)。
为方便调试,将启动内核命令设置到bootcmd环境变量:
setenv bootcmd "tftp 0x00200000 kernel8.img;dcache flush;go 0x00200000"
saveenv
6.总结
本文介绍了树莓派4b移植64位uboot的过程,主要目的是便于后期调试自己基于树莓派开发的操作系统,操作系统主要借鉴linux。后期主要在windows上开发:
开发软件:Source Insight(代码编辑),SecureCRT(串口及ssh通信客户端)。
代码编译:主机和VMware虚拟机创建共享文件夹,代码保存在共享文件夹内,VMware虚拟机需要开启ssh服务,在主机编辑好代码后,使用SecureCRT以ssh的方式连接到虚拟机并编译代码。
以上是实验过程中遇到的问题和笔记总结,如果有不明白或错误的地方,欢迎大家讨论指教。