|
楼主 |
发表于 2018-10-4 01:08
|
显示全部楼层
本帖最后由 糜恒博 于 2018-10-6 22:33 编辑
本文涉及代码位于:https://github.com/zhaohengbo/rt-uboot-aarch64-demo
0.序前文我们搭建了armv7的多线程bootloader开发环境,由于目前armv8即将成为主流,因此这个帖子我们来说说armv8的多线程bootloader环境搭建
与前文相同,aarch64下,我们依然使用qemu作为仿真开发环境,至于平台,似乎只有一个选择[只看到这一个,貌似别的SOC都不支持平台仿真]-----xilinx的zcu102
1.工具链的安装
对于aarch64环境来说,工具链也是一样的选择
本例中,由于使用模拟环境,所以不如采用通用性较强的系统自带的工具链(当然有一定代价)
安装命令如下:sudo apt-get install gcc-aarch64-linux-gnu
安装好后,输入aarch64-linux-gnu-gcc,如果看到如下提示,即为安装成功。
2.uboot基础版本的选择
通常来说uboot对qemu模拟的平台一般都有极佳的支持度,但是对于zcu102而言,由于其主流uboot启动需要pmufw的参与,无法在仿真平台执行,因此选用早期uboot,这里选用的是xilinx官方的2016.4版的uboot,下载地址https://github.com/Xilinx/u-boot-xlnx.git,选用v2016.4
下载后,解压到某文件夹下即可
3.基础脚本编写
uboot的编译需要先设置环境变量,然后config,然后再make,每次都搞一遍略有些麻烦,所以干脆设置个脚本:
- export ARCH=arm
- export CROSS_COMPILE=aarch64-linux-gnu-
- make xilinx_zynqmp_zcu102_defconfig
- make
复制代码
将以上内容保存到build.sh并加可执行权限以备用
4.qemu的编译安装
由于在标准qemu上执行始终有问题,因此使用了xilinx的qemu,首先clone其代码:https://github.com/Xilinx/qemu.git
然后安装依赖:sudo apt install libglib2.0-dev libgcrypt20-dev zlib1g-dev autoconf automake libtool bison flex
然后更新子模块:git submodule update --init dtc
然后配置一下:./configure --target-list="aarch64-softmmu,microblazeel-softmmu" --enable-fdt --disable-kvm --disable-xen --prefix=/opt/xlinx-qemu
由于需要同时使用标准qemu,因此使用--prefix=/opt/xlinx-qemu将其安装到一个独立文件夹中
最后,make -j4 V=99
编译成功后,再sudo make install
此时,export PATH=/opt/xlinx-qemu/binPATH
再执行qemu-system-aarch64 -M ?应该能看到正确输出
5.虚拟机运行脚本编写
为了简单起见,我们直接将虚拟机运行uboot的命令编写成一个脚本执行,脚本代码如下:
- export PATH=/opt/xlinx-qemu/bin:$PATH
- qemu-system-aarch64 -M arm-generic-fdt \
- -serial mon:stdio -display none \
- -device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4 \
- -device loader,file=./prebuild/bl31.elf,cpu-num=0 \
- -device loader,file=./prebuild/pmufw.elf \
- -device loader,file=./u-boot.elf \
- -hw-dtb ./prebuild/zcu102-arm.dtb
复制代码
保存为raw-run.sh并加可执行权限即可
同时为了以后调试方便,增加带调试接口版脚本
- export PATH=/opt/xlinx-qemu/bin:$PATH
- qemu-system-aarch64 -M arm-generic-fdt \
- -serial mon:stdio -display none \
- -device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4 \
- -device loader,file=./prebuild/bl31.elf,cpu-num=0 \
- -device loader,file=./prebuild/pmufw.elf \
- -device loader,file=./u-boot.elf \
- -hw-dtb ./prebuild/zcu102-arm.dtb \
- -gdb tcp::2333 \
- -S
复制代码
保存为gdb-run.sh并加可执行权限即可
为了能够让程序正常执行,我们还需要pmufw.elf、bl31.elf和zcu102-arm.dtb三个文件其中pmufw.elf和bl31.elf可以从xilinx的release版镜像中提取:https://xilinx-wiki.atlassian.ne ... Zynq+2016.4+Release
而zcu102-arm.dtb需要从手工编译:
首先clone代码:https://github.com/Xilinx/qemu-devicetrees
然后安装依赖:sudo apt install device-tree-compiler gcc make
最后make
选择生成目录下的single_arch文件夹下的zcu102-arm.dtb即可
这三个文件全部拷贝到prebuild文件夹下
都做完之后,可以运行build.sh再运行raw-run.sh观察效果,如果不出意外,可以看到uboot再虚拟机上被执行
(图片为已移植rt-uboot后的启动图片)
6.lib_rtos 系统移植
接下来就可以进行多线程内核的移植了,rt-uboot基于开源的rt-thread,取其内核作为rt-uboot实时内核,此处的具体移植原理、方式可以参见楼主之前写的技术篇:
https://www.right.com.cn/forum/thread-337363-1-1.html
如果大家不想手工移植,也可以下载楼主移植好的源代码:https://github.com/zhaohengbo/rt-uboot-aarch64-demo
7.rt-uboot编译与运行
默认情况下,rt-uboot demo包括两个线程,一个运行main_loop()主循环,一个运行led_test,在模拟器中,因为没有led,为了测试多线程是否工作,所以可以在led_test线程中加入一个printf用于打印输出第二个线程的消息。
加入点在lib_rtos/glue.c
改动完后,运行build.sh再运行raw-run.sh观察效果,如果不出意外,可以看到arm版的多线程bootloader在qemu上被成功运行
8.调试
有时候,程序的开发和移植并非一次就可以成功的,此时可以通过调试手段进行调试,我们可以通过运行build.sh再运行gsb-run.sh来实现。
运行后,本地打开了一个2333端口用于gdb调试,打开gdb(终端输入gdb-multiarch),通过target remote 127.0.0.1:2333即可连接
使用symbol-file u-boot载入符号表,由于刚开始代码从bl3执行,所以下断点到uboot的reset位置0x8000000,然后continue到断点
现在可以开始调试了,我们可以查看寄存器
也可以单步执行程序
更多用法请参考gdb使用手册
注:如果想使用ddd等图形化调试界面,方式同理(ddd gdb-multiarch,然后target remote 127.0.0.1:2333)
9.尾
本文简单介绍了aarch64版多线程bootloader的开发、调试环境搭建,并未涉及多线程bootloader相关设计细节,如需要了解细节,可以访问:https://www.right.com.cn/forum/thread-337363-1-1.html
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|