点击蓝字 关注我们
小编叨叨叨
暑期2021中期审核马上要开始了,还未提交中期报告及代码的同学尽快前往暑期2021管理系统以及组委会Gitlab仓库提交中期审核材料哦!
暑期2021项目研发正在火热进行中,开源之夏公众号面向广大社区及项目承担学生征稿,欢迎大家热情分享:
发送投稿文章至官方联络邮箱:
summer@iscas.ac.cn
添加公众号小编微信投稿:

本期分享来自 RT-Thread 社区胡自成同学(RT-Thred Smart x86移植)的项目经验。
自我介绍
大家好,我是胡自成,我参与了RT-Thread开源社区的项目,很高兴有这次机会能来和大家分享本次的项目经验!
项目名称
RT-Thread Smart x86移植
项目综述
目前RT-Thread Smart主要支持了ARM Cortex-A(如树莓派),MIPS64(如龙芯2K1000),RISC-V(如嘉楠K210、全志 D1)。而对于大家更为广泛使用的PC,x86架构还不支持。RT-Thread Smart for x86就是一份对PC的基础移植,主要是对主要环境的移植,例如控制台,ATA硬盘,有线以太网等。
项目步骤
1.分析项目需求
2.查找x86架构相关资料
3. 学习RT-Thread Smart移植接口
4. 针对arch接口做代码移植
项目实施
分析项目需求
对x86架构的移植,首先需要对x86架构比较熟悉,有相关的开发经验。然后就是要有驱动开发经验,要实现ATA硬盘驱动和pcnet网卡,驱动的调试在驱动框架的支持下是比较方便的。除此之外,还要能够最后合并到RT-Thread Smart仓库中,就要遵守代码规范才行。
查找x86架构相关资料
x86架构简介:1978年6月8日,Intel发布了新款16位微处理器“8086”,x86架构就此诞生了,直到现在已经发展了40余年,广泛地应用于服务器以及PC个人电脑中。它是属于CISC复杂指令集,和Arm,RISC-V架构有比较大的区别,由于历史悠久,历史包袱也是比较严重的,也就比较复杂了。

兼容x86架构intel处理器
目前国内关于x86的资料还是比较多的,教学的操作系统基本都是使用x86架构,学习资料丰富,可以参考的地方也比较多,为移植做好了铺垫。
学习RT-Thread Smart移植接口
RT-Thread Smart在RT-Thread的基础上做了升级,添加了对MMU的支持,LWP轻量级进程的支持,这就意味着,Smart版本可以做到多进程,进程空间隔离,那么就可以在性能更高,支持MMU的芯片上运行。

RT-Thread Smart架构图
由于RT-Thread Smart是支持POSIX接口的,那么对gnu应用程序的支持也就比较方便了,未来的应用领域也就变得更广阔了。
Smart版本的移植的核心点在于bsp,libcpu,lwp component中与平台相关的部分代码的移植。
针对arch接口做代码移植
在bsp中,主要是板子的初始化和驱动程序的实现,目前实现了uart串口驱动,ahci磁盘驱动,时钟驱动等。除此之外就是一些编译配置脚本,RT-Thread采用的是SCons构建脚本,它是使用python开发的一个轻量级,功能强大的构建脚本,只需要需要提供一个SConstruct作为入口,一个或者多个SConscript作为子脚本,就可以完成一个项目的构建。

SConscript脚本的组成方式
在libcpu中就是存放和处理器相关的代码,比如内核入口,中断初始化,MMU初始化与页表映射,线程上下文的切换等内容。
目前使用GRUB作为引导器,GRUB是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。

GRUB引导RT-Thread Smart系统
开机后后,会先执行BIOS自检,会对硬件设备进行一个初始化,完成后,就会选择一个可引导的磁盘,从上面加载引导扇区。引导介质可以是软盘,硬盘,光盘,网络,只要是可引导的扇区,那么这个BIOS就会跳入引导扇区代码执行。GRUB目前是打包在光盘上面,所以在读取光盘的时候,会识别为可引导磁盘,就会执行GRUB的引导代码。最开始进入的时候是实模式,也就是16位模式,最大可以寻址1MB,在进行一系列设置后,就切换到保护模式,并且跳入rtthread内核。从GRUB进入内核后,就是出于保护模式,可以进行32位寻址,这样,就可以大展手脚了!

RT-Thread Smart的启动流程
lwp是Light-Weight Process的缩写,是RT-Thread中的组件,这个组件可以实现多进程功能。lwp的移植中主要涉及到的内容是用户空间的初始化,用户栈的初始化,内核进入用户入口的实现,信号捕捉以及返回的实现等。通过这部分的移植,就可以实现用户态的应用程序的运行。

RT-Thread Smart在QEMU虚拟机中的运行效果
这样,内核的基础内容移植就完成了,后续可以进行适当完善,优化一下代码,添加更多驱动,增强内核稳定性等。
bsp部分代码展示:

libcpu部分代码展示:

lwp部分代码展示:

项目总结
从着手项目开始,到内核移植的基础完成,花了1个多月。最开始在环境搭建上面跌跌撞撞,到后面遇到BUG慢慢调试,经历这些之后,又增加了许多知识,掌握了更多调试方法。在遇到问题的时候,和导师熊大进行讨论,也很快得到了回复,迅速定位了问题所在。除此之外,也认识了RT-Thread开源社区的其他大牛,再一次感受到了开源的魅力!
在移植期间,学习了Kconfig配置,SCons脚本,以及git更加丰富的用法,学习到了Smart内核中很多巧妙的设计,了解到了同一个东西的不同实现方式,开阔了视野!
最后,希望大家多多关注RT-Thread社区,成为活跃的开源项目开发者!希望RT-Thread社区越办越好!开源之夏越办越好!
本文为胡自成同学原创文章,欢迎更多同学参与投稿开源之夏,分享你的热爱。





