找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
本帖最后由 糜恒博 于 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 收起 理由
boy65*** + 1 瞬间觉得自己好弱啊!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| | 显示全部楼层
本帖最后由 糜恒博 于 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.
回复

使用道具 举报

 楼主| | 显示全部楼层
第三楼给mips备用
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

有ipq8065的开发板,有jlink,就是没时间测试。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

前排支持,感谢分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

月考,高中生来的吗?

点评

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

使用道具 举报

高中生赶快去好好学习
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

厉害的同学
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

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

使用道具 举报

好腻害依稀记得楼主是高中生,还是个妹子
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

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

使用道具 举报

妈耶,太牛叉了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

楼主强悍,顶你!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
半夜发帖不好 不要熬夜……

点评

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 01:41

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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