2. DRIVE OS基础与开发环境搭建
DRIVE OS 是 NVIDIA 为 DRIVE 系列车载计算平台提供的底层软件发行版,它并不是一个单一的操作系统,而是由引导固件、Hypervisor、QNX 实时域、Linux 通用域、驱动、CUDA/TensorRT 运行时以及一系列板级支持包共同组成的软件栈。理解它的分层结构,是后续所有集成与部署工作的前提。
DRIVE OS 的分层架构与双系统协作
从下往上看,DRIVE OS 大致分为四层:最底层是 BootROM 与引导链(Bootloader),负责上电自检、加载 Hypervisor 镜像;其上是 NVIDIA Hypervisor,它把 SoC 的 CPU 核、内存区域、外设控制器按分区划分给不同的 Guest OS;再往上是两个并行的客户操作系统——QNX 实时域和 Linux 通用域;最上层是应用与中间件,包括 DriveWorks、CUDA、TensorRT、NvMedia 等。
QNX 域承担安全关键任务,例如传感器时间同步、底盘 CAN 报文收发、实时控制回路,它的调度延迟通常在微秒级,且具备功能安全认证基础。Linux 域则承担算力密集但非安全关键的负载,例如感知模型的推理、数据记录、可视化与云端通信。两者通过 Hypervisor 提供的共享内存通道和 virtio 设备进行通信,典型方式是 QNX 侧采集并打时间戳,通过共享内存把数据交给 Linux 侧做推理,推理结果再回传给 QNX 侧做决策。这种“实时域管控制、通用域管算力”的分工,是 DRIVE OS 最核心的设计思想。
SDK Manager 安装与目标板连接
开发环境搭建的第一步是在宿主机(Host)上安装 NVIDIA SDK Manager。宿主机推荐使用 Ubuntu 20.04 或 22.04,因为 SDK Manager 的依赖包和驱动对这两个版本支持最完整。安装流程是:从 NVIDIA 开发者网站下载 sdkmanager_*.deb,执行 sudo apt install ./sdkmanager_*.deb,然后运行 sdkmanager 启动图形界面。登录 NVIDIA 开发者账号后,选择产品类别为 DRIVE,目标硬件选择对应的 DRIVE AGX 平台(如 Orin),再勾选需要安装的组件:DRIVE OS、CUDA、TensorRT、DriveWorks 等。
SDK Manager 支持两种刷写模式:一是通过 USB-C 连接目标板,把宿主机作为刷写主机;二是通过局域网连接已运行的目标板,只做组件安装而不重新刷写系统。首次搭建通常采用 USB 方式。操作时需要用跳线或按键把目标板置于恢复模式(Recovery Mode),此时 lsusb 应能看到 NVIDIA 的 USB 设备(例如 0955:7023 这类 VID:PID)。如果看不到,说明恢复模式未进入或线缆不支持数据传输,需要先排查这一步再继续。
刷写完成后,目标板会重启进入 DRIVE OS。此时通过串口(默认 115200 8N1)或 SSH 登录。串口登录可以看到完整的启动日志,是排查启动问题的第一手资料;SSH 登录则用于日常开发。默认用户名通常为 nvidia,首次登录后应立即修改密码并配置网络,使宿主机与目标板处于同一网段,便于后续的文件传输与远程调试。
cat /etc/nvidia/version 或 nv_tegra_release 核对版本,避免宿主机 SDK 版本与目标板固件不匹配导致后续编译或运行异常。交叉编译工具链配置
车载开发的一个基本事实是:宿主机是 x86_64,而目标板是 aarch64。因此绝大多数代码需要在宿主机上交叉编译,再部署到目标板运行。DRIVE OS 的交叉编译工具链通常随 SDK 一起安装,路径类似 /usr/local/driveworks/targets/aarch64-Linux/toolchains/ 或由 SDK Manager 安装到 /opt/nvidia/ 下。
配置的核心是让构建系统知道三件事:编译器前缀、sysroot 路径、目标架构。以 CMake 为例,可以写一个工具链文件:
# toolchain-aarch64.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(TOOLCHAIN_ROOT /opt/nvidia/drive/toolchains/aarch64)
set(CMAKE_C_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT ${TOOLCHAIN_ROOT}/aarch64-linux-gnu/sysroot)
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
配置完成后,用 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-aarch64.cmake .. 生成构建文件。验证工具链是否生效,可以编译一个最小程序并用 file 命令检查产物架构,输出中应包含 ARM aarch64 字样。如果显示 x86-64,说明工具链文件未被正确加载,需要检查路径与 CMake 调用参数。
首个 Hello World 部署与验证
下面用一个最小示例走通“编写—交叉编译—传输—运行”的完整链路。在宿主机创建 hello.c:
#include <stdio.h>
int main(void) {
printf("Hello DRIVE OS from aarch64!\n");
return 0;
}
用工具链编译:aarch64-linux-gnu-gcc hello.c -o hello。随后通过 scp hello nvidia@<目标板IP>:/home/nvidia/ 传输到目标板,在目标板上执行 chmod +x hello && ./hello。若终端输出 Hello DRIVE OS from aarch64!,说明交叉编译工具链、网络连接与目标板运行环境三者均已打通。
如果运行时报 cannot execute binary file: Exec format error,说明编译产物架构不对,应回到工具链配置检查;如果报 No such file or directory 但文件确实存在,通常是动态链接器路径不匹配,可用 aarch64-linux-gnu-readelf -l hello 查看 interpreter 字段,确认它指向目标板 sysroot 中真实存在的 ld-linux-aarch64.so.1。这一步排查能力,比 Hello World 本身更重要,因为后续所有应用部署都会遇到同类问题。
CMAKE_SYSROOT 与 PKG_CONFIG_PATH 是否指向目标板对应的路径。