找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 30720|回复: 27

【2018-10-06】手把手教你搭建多线程bootloader开发环境(基于rt-uboot)

[复制链接]
发表于 2018-10-4 00:57 | 显示全部楼层 |阅读模式
本帖最后由 糜恒博 于 2018-10-6 22:32 编辑

最近月考考砸了,所以rt-uboot的arm版就没怎么特别更新(被老爸关了禁闭),不过想着国庆不放点东西出来对不起这七天长假,于是就整理了一下形成了本文

更新完ARM[楼层1]和AARCH64[楼层2]

rt-uboot技术原理链接如下:
https://www.right.com.cn/forum/thread-337363-1-1.html
本文涉及代码github地址如下:
https://github.com/zhaohengbo/rt-uboot-arm-demo
本文和技术原理作为互补,本文主要讲述如何搭建一个多线程bootloader的基本开发环境

不出意外的话,本文将分为3个板块介绍,分别是mips环境、arm环境、aarch64环境
因为目前各方人马都在arm版多线程bootloader上发力(就我知道的不算我这应该有三方),所以先写arm环境:

0.序
一般来说,由于arm提供的一般为可以综合的软核而非硬核,所以厂家自定义的空间非常大,这也是造成arm底层移植的一个重要原因。
由于本文的目的是介绍环境的搭建,因此很难选用某一特定的开发板,同时考虑到本文的受众很有可能手里并不具备开发板,因此决定选用仿真软件来模拟实际的开发板,教大家如何搭建、开发、调试多线程bootloader(基于rt-uboot)。
qemu提供了丰富的可仿真的SOC,这里选用vexpress_ca9x4平台,这是一个资料非常多的平台,datasheet如下:





1.工具链的安装
对于arm环境来说,工具链一般有3种选择:openwrt的工具链(基于buildroot)、开发厂商自带的工具链、系统自带的工具链(比较通用)
本例中,由于使用模拟环境,所以不如采用通用性较强的系统自带的工具链(当然有一定代价)
安装命令如下:sudo apt-get install gcc-arm-linux-gnueabi
安装好后,输入arm-linux-gnueabi-gcc,如果看到如下提示,即为安装成功。

注意:此时gdb没有被安装,需要使用sudo apt-get install gdb-multiarch来安装

2.uboot基础版本的选择
uboot对qemu模拟的平台一般都有极佳的支持度,因此完全可以使用最新版uboot,这里采用官网下载的u-boot-2018.09.tar.bz2,下载地址http://ftp.denx.de/pub/u-boot/u-boot-2018.09.tar.bz2
下载后,解压到某文件夹下即可


3.基础脚本编写
uboot的编译需要先设置环境变量,然后config,然后再make,每次都搞一遍略有些麻烦,所以干脆设置个脚本:
  1. export ARCH=arm
  2. export CROSS_COMPILE=arm-linux-gnueabi-
  3. make vexpress_ca9x4_defconfig
  4. make
复制代码

将以上内容保存到build.sh并加可执行权限以备用

4.qemu的安装
对于ubuntu来说,安装过程很轻松,sudo apt-get install qemu即可
安装好之后,可以使用qemu-system-arm -M ?查看qemu支持的SOC,如果出现下图说明一切ok


5.虚拟机运行脚本编写
为了简单起见,我们直接将虚拟机运行uboot的命令编写成一个脚本执行,脚本代码如下:
  1. qemu-system-arm \
  2. -M vexpress-a9 \
  3. -nographic \
  4. -m 512M \
  5. -kernel u-boot
复制代码

保存为raw-run.sh并加可执行权限即可

同时为了以后调试方便,增加带调试接口版脚本
  1. qemu-system-arm \
  2. -M vexpress-a9 \
  3. -nographic \
  4. -m 512M \
  5. -kernel u-boot \
  6. -gdb tcp::2333 \
  7. -S
复制代码

保存为gdb-run.sh并加可执行权限即可

都做完之后,可以运行build.sh再运行raw-run.sh观察效果,如果不出意外,可以看到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-arm-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载入符号表

现在可以开始调试了,我们可以查看寄存器

也可以单步执行程序

更多用法请参考gdb使用手册
注:如果想使用ddd等图形化调试界面,方式同理(ddd gdb-multiarch,然后target remote 127.0.0.1:2333)

9.尾
本文简单介绍了arm版多线程bootloader的开发、调试环境搭建,并未涉及多线程bootloader相关设计细节,如需要了解细节,可以访问:https://www.right.com.cn/forum/thread-337363-1-1.html

对于其他平台如mips和aarch64,其方法和步骤非常类似,楼主将逐渐更新。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1恩山币 +1 收起 理由
boy6585948 + 1 瞬间觉得自己好弱啊!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 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,每次都搞一遍略有些麻烦,所以干脆设置个脚本:
  1. export ARCH=arm
  2. export CROSS_COMPILE=aarch64-linux-gnu-
  3. make xilinx_zynqmp_zcu102_defconfig
  4. 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的命令编写成一个脚本执行,脚本代码如下:
  1. export PATH=/opt/xlinx-qemu/bin:$PATH
  2. qemu-system-aarch64 -M arm-generic-fdt \
  3. -serial mon:stdio -display none \
  4. -device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4 \
  5. -device loader,file=./prebuild/bl31.elf,cpu-num=0 \
  6. -device loader,file=./prebuild/pmufw.elf \
  7. -device loader,file=./u-boot.elf \
  8. -hw-dtb ./prebuild/zcu102-arm.dtb
复制代码


保存为raw-run.sh并加可执行权限即可


同时为了以后调试方便,增加带调试接口版脚本
  1. export PATH=/opt/xlinx-qemu/bin:$PATH
  2. qemu-system-aarch64 -M arm-generic-fdt \
  3. -serial mon:stdio -display none \
  4. -device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4 \
  5. -device loader,file=./prebuild/bl31.elf,cpu-num=0 \
  6. -device loader,file=./prebuild/pmufw.elf \
  7. -device loader,file=./u-boot.elf \
  8. -hw-dtb ./prebuild/zcu102-arm.dtb \
  9. -gdb tcp::2333 \
  10. -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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-4 01:09 | 显示全部楼层
第三楼给mips备用
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 01:29 | 显示全部楼层
有ipq8065的开发板,有jlink,就是没时间测试。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 03:28 | 显示全部楼层
前排支持,感谢分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 07:38 | 显示全部楼层
月考,高中生来的吗?

点评

马上就是了  详情 回复 发表于 2018-10-4 09:55
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 07:42 | 显示全部楼层
高中生赶快去好好学习
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 09:05 | 显示全部楼层
厉害的同学
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-4 09:55 | 显示全部楼层
忽徙北321 发表于 2018-10-4 07:38
月考,高中生来的吗?

马上就是了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 10:32 | 显示全部楼层
好腻害依稀记得楼主是高中生,还是个妹子
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 11:11 来自手机 | 显示全部楼层
这么厉害!肯定是个萌妹子
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 11:12 | 显示全部楼层
妈耶,太牛叉了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-4 22:00 | 显示全部楼层
楼主强悍,顶你!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2018-10-5 19:32 来自手机 | 显示全部楼层
半夜发帖不好 不要熬夜……

点评

白天都写作业了╯﹏╰  详情 回复 发表于 2018-10-7 06:54
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2018-10-7 06:54 来自手机 | 显示全部楼层
旁观者迷 发表于 2018-10-5 19:32
半夜发帖不好 不要熬夜……

白天都写作业了╯﹏╰
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-3-29 13:00

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表