内核启动时间优化
NVIDIA® Jetson™ Linux (L4T) 为您的产品开发提供了一个通用的启动内核。为了减少内核启动时间,请根据您产品的需求定制提供的内核。
内核包含默认配置,该配置启用了所有受支持的硬件功能,并搜索所有可用设备以查找启动脚本。这为最广泛的控制器、功能、存储设备和启动配置提供了开箱即用的支持。
这种灵活性是有代价的
• 某些硬件支持需要时间来初始化
• 启用所有软件功能,尤其是通过高级外围总线 (APB),需要时间
• 扫描所有连接的存储和网络设备需要时间,从而延迟最终操作系统的执行
在受限或预配置的系统中,这种灵活性可能不是必需的;系统设计者可能提前知道哪个存储设备包含所需的文件,或者某些设备不需要由内核初始化。为了减少系统启动时间,您可以配置内核以遵守这些约束。
对于运行默认配置的 L4T 的 NVIDIA® Jetson™ TX1 系统,从冷启动到开始显示登录提示需要 12 秒。当应用以下优化技术时,该过程可以缩短到大约三秒。
设备树节点
如果您不使用 Jetson SoC 中的任何控制器,请禁用这些设备树条目的设备树节点。设备树目录位于
<top>/hardware/nvidia/platform/t18x/
<top>/hardware nvidia/soc/t18x
刷写的 DTB 位于
<top>/hardware/nvidia/platform/t18x/quill/kernel-dts/tegra186-quill-p3310-1000-a00-00-base.dts
实时时钟
默认情况下启用两个实时时钟 (RTC)
• NVIDIA® Tegra® RTC
• PMIC RTC
根据您的开发需求,启用一个、两个或都不启用。请注意以下差异
• Tegra RTC 响应速度最快,但当系统关闭时,不能作为备用 RTC 工作。
• PMIC RTC 可以作为备用 RTC 工作,但由于到 I2C 的传输平均速度较慢,因此响应速度较慢。
如果您不关闭系统,或者您不关心备份时间,那么您不需要启用 RTC。禁用 RTC 可以加快启动时间。
要禁用 RTC
1. 从您的 tegra21_defconfig 文件中删除以下配置。
CONFIG_RTC_DRV_MAX77620=y
2. 将以下配置添加到 tegra21_defconfig 文件。
# CONFIG_RTC_HCTOSYS is not set
3. 在 DTS 文件中将 Tegra RTC 设置为禁用,如下所示
rtc {
compatible = "nvidia,tegra-rtc";
reg = <0x00000000 0x00000003 0x00000002 0x0000009b>;
interrupts = <0x00000000 0x00000005 0x00000002>;
status = "disabled";
};
环境配置
您可以通过修改根文件系统中的环境配置来优化启动时间。
禁用 UART 控制台
通过 UART 进行控制台打印是内核启动时间的主要瓶颈。为了减少瓶颈,您可以通过从平台配置文件中删除 console=ttyS0 来减少通过 UART 进行的控制台打印量。
要减少通过 UART 进行的打印量,请按照以下说明操作
• 对于 NVIDIA® Jetson Nano™ 设备:编辑平台配置文件 p3448-0000.conf 以删除规范 console=ttyS0。
• 对于 NVIDIA® Jetson AGX Xavier™ 系列:编辑平台配置文件 p2972-0000.conf.com 以删除规范 console=ttyTCU0。
• 对于 NVIDIA® Jetson™ TX2 系列:编辑 p2771-000.conf.common 以删除规范 console=ttyS0。(此文件包含在 Jetson TX2 的平台配置文件 p2771-0000-devkit.conf 或 Jetson TX2i 的 p2771-3489-ucm1.conf 中。)
在您执行此操作后,您仍然可以通过帧缓冲控制台查看控制台日志。
二级引导加载程序
您可以删除 U-Boot 作为二级引导加载程序,以消除 u-boot 的启动时间。刷写前需要进行以下修改
1. 编辑以下位置的通用配置文件
<top>/tegra_for_linux/ p2771-000.conf
2. 将 USE_UBOOT 设置为 0。
# 配置是否使用 U-Boot,
# 在运行 flash.sh 之前执行以下任一操作
# 1) 将环境变量 USE_UBOOT 设置为 0 或 1。
# 2) 编辑下面这行代码以将 USE_UBOOT 设置为 0 或 1。
if [ -z "${USE_UBOOT}" ]; then
USE_UBOOT=0;
fi;
编译时配置
为了减少编译时配置,请检查生成的配置文件以确定哪些配置是必需的。一旦定义了必需的配置,请确定哪些配置要异步启动。对于这些配置,驱动程序探测在单独的线程中异步执行,而不是在主初始化线程中执行。
此外,检查所需的配置并验证它们是否可以编程为模块,以便在需要使用时加载驱动程序。当驱动程序未加载时,内核映像会减小,并且有更多的 RAM 空间可用。
以下主题提供了每个这些条件的示例。
异步探测
默认情况下,从内核版本 3.18 开始提供异步探测功能
要将驱动程序移动到另一个线程
• 在您的驱动程序中添加 probe_type,如下所示
static struct platform_driver sdhci_tegra_driver = {
.driver = {
.name = "sdhci-tegra",
.of_match_table = sdhci_tegra_dt_match,
.pm = SDHCI_PLTFM_PMOPS,
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
},
.probe = sdhci_tegra_probe,
.remove = sdhci_tegra_remove,
.shutdown = sdhci_tegra_shutdown,
};
文件系统
为了减少启动时间文件系统,修改以下配置以将它们设置为模块
CONFIG_FUSE_FS=m
CONFIG_VFAT_FS=m
CONFIG_NTFS_FS=m
声音
音频编解码器需要一些时间来初始化。为了消除此初始化时间,请禁用音频配置,如下所示
# CONFIG_SND_SOC_TEGRA_ALT is not set
# CONFIG_SND_SOC_TEGRA_ALT_FORCE_CARD_REG is not set
# CONFIG_SND_SOC_TEGRA_T186REF_ALT is not set
# CONFIG_SND_SOC_TEGRA_T186REF_MOBILE_ALT is not set
模块化内核驱动
为了减少启动时间,请模块化启动期间不需要的驱动程序,例如:HID、NET、QSPI 或 USB。
禁用调试
为了减少启动时间,请在生产配置中禁用调试内核 hacks。
例如:FTRACE、TRACER、KMEMLEAK 等。