Android系统10 RK3399 init进程启动(八) u-boot启动逻辑

本文详细介绍了RK3399设备在Android10.0系统下u-boot的编译步骤和生成的各个镜像文件,包括u-boot.bin、uboot.img、rk3399_loader_v1.24.126.bin、trust.img的生成过程。同时,阐述了RK3399上电启动时u-boot的执行逻辑,从bootrom加载到u-boot运行的完整流程。

 配套系列教学视频链接:

      安卓系列教程之ROM系统开发-百问100ask

说明

系统:Android10.0

设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

         上一篇讲到了u-boot编译完成之后,会生成各种镜像, 本章节重点介绍u-boot各个镜像生成的基本流程, 通过了解文件, 来辅助理解rk3399 u-boot启动基本过程。


一,编译u-boot的一般步骤

如果不考虑现有源码中的各种脚本, 比如不管make.sh, 编译u-boot的源码的一般步骤有以下通用步骤:

1,设置交叉工具链,一般修改Makefile

        ARCH=arm
        CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

或者在make命令后面直接传递参数。

2, 选择芯片配置文件, 如rk3399, 其实是将configs/xxx_defconfig拷贝到顶层目录.config

        make rk3399_defconfig

3,  make编译

二, u-boot.bin文件生成

可以通过编译的调试信息中发现如下结果:

 /mnt/ext-disk2/RK/rk3399_Android10.0/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy --gap-fill=0xff  -j .text -j .secure_text -j .secure_data -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .got -j .got.plt -j .dtb.init.rodata -j .efi_runtime -j .efi_runtime_rel -O binary  u-boot u-boot-nodtb.bin
 

 cat u-boot-nodtb.bin dts/dt.

RK3568平台上,Android系统开机广播(Boot Broadcast)启动延迟可能涉及多个系统层级的问题,包括系统启动流程、服务初始化、内核调度以及硬件驱动加载等。以下是一些常见的调试方法和优化建议: ### 1. 分析系统启动日志 首先,通过`logcat`或`dmesg`命令获取系统启动阶段的日志信息,定位广播延迟发生的具体阶段。重点关注以下内容: - **Android Framework层**:查看`ActivityManager`和`PackageManager`相关的日志,确认系统服务启动是否耗时过长。 - **系统服务初始化**:检查系统关键服务(如`SystemServiceManager`)的启动耗时。 - **广播接收器执行时间**:确认是否有广播接收器执行时间过长,导致主线程阻塞。 ```bash logcat -b main -d | grep "BOOT_COMPLETED" ``` ### 2. 使用`bootchart`工具分析启动性能 `bootchart`是一个用于分析Linux系统启动性能的工具。通过启用`bootchart`功能,可以可视化系统启动过程中的进程启动顺序和资源占用情况,帮助识别瓶颈。 在Android系统中,可以通过修改`init`配置文件启用`bootchart`: ```bash # 在init.rc或对应的设备配置文件中添加 setprop debug.bootchart 1 ``` 系统重启后,生成的`/data/bootchart`目录中会包含启动性能图表数据。 ### 3. 检查系统服务依赖和启动顺序 Android系统启动流程包含多个阶段,其中`BOOT_COMPLETED`广播通常在所有核心服务启动完成后发出。如果系统服务存在不必要的依赖或启动顺序不合理,可能会导致广播延迟。 - **优化服务启动顺序**:确保关键服务优先启动,非核心服务延迟加载。 - **延迟加载非必要服务**:通过`start`命令或`post`方法延迟启动部分服务,减少主线程负担。 ### 4. 调整内核调度策略 在系统启动过程中,内核调度策略可能影响进程的执行顺序和响应时间。可以通过调整调度优先级或使用`cpuset`机制优化关键进程的CPU资源分配。 例如,调整某个关键进程的优先级: ```bash nice -n -20 <pid> ``` ### 5. 检查硬件驱动加载时间 RK3568平台的硬件驱动加载时间也可能影响系统启动速度。特别是涉及外部存储、GPU、显示控制器等模块的初始化过程。可以通过以下方式优化: - **异步加载驱动**:将部分非核心驱动模块设置为异步加载。 - **减少驱动初始化时间**:优化驱动代码逻辑,减少不必要的初始化操作。 ### 6. 使用`Traceview`或`Systrace`进行性能分析 Android 提供了 `Traceview` 和 `Systrace` 工具,可以对系统启动过程中的方法调用和线程调度进行详细分析。通过这些工具可以识别出耗时较长的方法或线程阻塞点。 启用`Systrace`进行系统启动分析: ```bash python systrace.py --time=10 -o boot_trace.html ``` ### 7. 修改广播发送时机 如果确认`BOOT_COMPLETED`广播的发送时机过晚,可以通过修改系统源码中的广播发送逻辑,提前发送广播。通常广播发送逻辑位于`SystemServer`或`ActivityManagerService`中。 例如,在`SystemServer`的启动流程中,可以调整广播发送的时机: ```java // frameworks/base/services/java/com/android/server/SystemServer.java private void sendBootCompletedBroadcast() { Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED); intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT); mContext.sendBroadcast(intent); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旗浩QH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值