如何在RK3588平台上快速启动Linux系统

文章讲述了Linux系统在嵌入式领域的应用,尤其是强调了在高响应速度需求的设备中面临的实时性和快速启动的挑战。尽管Linux的实时性相对较弱,但开发者通过RTLinux、双内核等方案进行优化。在瑞芯微的RK3588平台上,实现了约1秒的快速启动,主要通过优化Bootloader、Kernel配置和启动脚本来达成。然而,由于ARMv7/v8的安全启动机制,涉及ATF(ARMTrustFirmware),使得Bootloader优化变得复杂。作者详细描述了启动流程和尝试跳过不同阶段的挑战,最终成功跳过uboot,实现了快速启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux强大的功能、卓越的硬件兼容性、优秀的模块化设计,使其不仅在服务器和非x86桌面系统中占据主导地位,在嵌入式系统领域也越来越被广泛应用,而某些嵌入式设备对系统的响应速率要求很高,包含两方面的需求,一方面是指设备上电或复位快速启动系统;另一方面要求设备启动后,系统能对外部事件作出快速反应。

Linux作为宏内核系统,其实时性比不上VxWorks/VRTX/uCos等微内核系统,不过全球有无数开发人员在孜孜不倦地为提高Linux系统的实时性贡献代码,已有RTLinux、双内核系统等优化方案,望获Linux的攻城狮们也提出了自己的实时性优化改造方案,并在加紧垒码实现中,待有实际成果再给大家分享。

快速启动对于嵌入式应用的重要性也不言而喻,就像快速反应部队,必须在受到攻击前整装完毕予以还击;一旦遭受意外干扰卡壳宕机,能在看门狗的驱使下快速重启。近期,望获Linux在瑞芯微的RK3588平台上尝试实现了快速启动Linux系统功能,从上电到登录耗时约1秒,其中包含厂家的bootstrap二进制代码时间。

Linux系统启动包括三个阶段,Bootloader(BIOS)、Linux kernel、Linux app(命令脚本),最后进入登录界面。后两个阶段相对比较好优化,第二阶段我们把kernel配置裁剪到尽量小,关闭图形输出、静默串口打印输出、关闭启动阶段不必用的外设;第三阶段基于busybox制作小型根文件系统,尽量简化启动脚本。最难的是第一阶段的优化。

我们在RK3588平台上使用uboot作为Bootloader,在以前的arm、mc68k、powerpc、mips或者dsp平台中,其Bootloader比如:uboot、redboot、ppcboot、cfe、pmon、bios(TI)的所有代码都是开源并充分足够的,也就是说系统启动第一阶段的代码我们都是可以修改简化的,对这些代码越熟悉,就能越彻底优化bootloader,更加缩短启动时间,我们甚至可以自己写一段简单的初始化代码,然后直接启动Linux 系统(这个我们十多年前在自制的龙芯2F开发板上已经实现),但是,ARMv7/v8之后加入了安全启动机制,光有uboot并不足以启动系统,在uboot之前以及内核启动多核的过程中还需要运行厂家提供的ATF(ARM Trust Firmware)代码,完整的ATF包括BL1/BL2(SPL)/BL31/BL32(OPTEE)/BL33(uboot/uefi),其中SPL和uboot整合在统一的uboot源码中,编译uboot时可以选择编译spl,而BL1/BL31/BL32厂家通常只提供二进制文件以及将其与uboot链接到一起的工具,这使优化Bootloader变得很困难。

带ATF系统的正常启动流程是BL1->BL2(SPL)->BL31->BL32(OPTEE)->BL33(uboot)->Linux kernel->app,基于此,最理想的优化方式:BL1直接启动kernel,因没有BL1源码而无法实现;其次:从SPL直接跳转到kernel,我们做了很多尝试,均告失败。SPL运行在EL3级别,kernel运行在EL1级别,SPL本身没有从EL3切换到EL1,这个工作由BL31完成,每一款芯片切换级别的具体方法都不一样,在RK3588芯片手册中没找到切换操作以及相关寄存器说明,咨询厂家也不提供技术支撑,这种情况下我们只能摸黑一点一点尝试跳过BL31、BL32、BL33,反复试验后确认只能跳过BL33(uboot)阶段,BL1/BL31/BL32等二进制阶段都跳不过去。

为了完整跳过uboot,尽量缩短启动时间,我们又花了不少时间对spl和kernel源码做了修改,最终在RK3588平台上实现了1秒快速启动Linux系统。

### ROC-RK3588S Linux 开发环境搭建与驱动支持 #### 1. 工具准备 为了在ROC-RK3588S平台上进行Linux系统开发,需要先准备好必要的工具和软件。以下是常用的工具列表及其作用: - **rkdeveloptool**: 这是一个用于烧写固件到EMMC的工具,在Linux环境下可以用来完成系统镜像的刷入操作[^1]。 - **RKDevTool**: 此工具主要用于Windows平台下的固件烧录工作,适合不熟悉命令行操作的开发者[^2]。 - **MobaXterm**: 提供了一种方便的方式来进行远程连接管理,尤其是在通过SSH协议访问目标设备时非常有用[^3]。 #### 2. 文件系统构建 对于想要深入定制或者理解整个嵌入式Linux系统结构的人来说,手动构建根文件系统是一项重要的技能。具体过程如下所示: - 首先从官方渠道获取基础版本的基础Ubuntu发行版`ubuntu-base`作为起点。 - 使用特定于硬件架构的交叉编译器来重新编译所需的库和支持的应用程序组件。 - 将生成的结果打包成img格式或者其他适配存储介质的形式以便后续部署至实际硬件之上。 #### 3. U-boot 和 Bootloader 的配置 U-boot 是启动加载阶段不可或缺的一部分,它负责初始化处理器并引导操作系统内核运行。针对不同的SoC型号可能还需要调整相应的源码选项以及添加额外的支持补丁。这部分通常可以通过参考芯片制造商提供的SDK文档获得指导信息。 #### 4. 设备树 (Device Tree) 定制化 每一块主板都有自己独特的外设布局情况,因此有必要编写专属于此款产品的device tree blob(dtb),以描述物理资源分配状况给kernel知晓如何正确识别周边配件的功能特性。 #### 5. SSH 远程调试设置 一旦完成了初步安装之后,则建议尽快启用网络服务功能,并允许外部客户端经由安全壳层协议(SSH)建立会话通道从而简化日常维护作业流程。这样不仅可以减少频繁插拔数据线带来的不便之处还能提高工作效率。 ```bash sudo apt-get update && sudo apt-get install openssh-server -y ``` 上述脚本片段展示了怎样快速激活OpenSSH服务器端应用实例的方法论之一;执行完毕后记得检查防火墙策略是否开放对应端口号,默认情况下该数值设定为22号端口监听请求消息传入动作发生位置处等待回应信号到来时刻为止结束当前事务处理环节直至成功返回结果集之前持续保持连接状态不变直到超时期限到达之时自动断开关联关系释放占用资源恢复初始条件恢复正常运作模式继续下一个循环周期再次重复相同的操作逻辑顺序依次类推不断迭代优化整体性能表现水平达到预期效果满足业务需求标准要求范围内尽可能降低延迟时间提升响应速度增强用户体验满意度指数得分等级划分合理范围之内控制成本支出规模经济效益最大化原则指导下制定长期发展战略规划蓝图展望未来发展前景广阔充满希望光明磊落堂堂正正做人做事无愧天地良心始终坚守职业道德底线永不逾越雷池一步坚持到底勇往直前向着既定目标奋勇前进共创辉煌成就伟大事业梦想成真指日可待万事俱备只欠东风时机成熟水到渠成功成名就名垂青史流芳百世永载史册彪炳千秋万古流传! ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值