3. 开发环境搭建:Ubuntu虚拟机、工具链与Git管理
做嵌入式Linux开发,环境搭建是第一道坎。很多新手一上来就急着编译内核,结果被各种依赖问题搞得焦头烂额。我个人习惯是先把开发环境理清楚,后面才能专心搞移植。
这一章我们聚焦三件事:Ubuntu虚拟机安装、交叉编译工具链配置、Git版本管理。这三样搞定了,后续的内核配置、设备树编写、驱动开发才能顺利推进。
核心要点:开发环境不是“装好就行”,而是要可复现、可迁移。我建议你把这套环境配置过程写成脚本,换机器时一键搞定。
3.1 Ubuntu虚拟机安装与配置
为什么选虚拟机?因为瑞芯微平台开发经常要切换不同内核版本、不同工具链,虚拟机快照功能可以让你随时回退。我在项目中吃过亏——直接在物理机上装Ubuntu,结果一次误操作把系统搞崩了,重装花了大半天。
3.1.1 虚拟机软件选择
| 软件 | 优点 | 缺点 | 我的建议 |
|---|---|---|---|
| VMware Workstation | 稳定、快照功能强、3D加速好 | 收费(有个人免费版) | 主力推荐,我用了8年 |
| VirtualBox | 免费开源、轻量 | 性能稍弱、USB透传偶尔出问题 | 预算有限时首选 |
| QEMU | 支持ARM架构模拟 | 配置复杂、速度慢 | 调试底层时用,日常不推荐 |
3.1.2 Ubuntu版本选择
瑞芯微官方SDK通常基于Ubuntu 18.04或20.04。我个人建议用Ubuntu 20.04 LTS,兼容性好,社区支持强。Ubuntu 22.04也能用,但有些老工具链的依赖库需要手动补。
小技巧:安装时选择“最小安装”,省掉LibreOffice等办公软件。嵌入式开发不需要这些,省下来的磁盘空间给内核源码。
3.1.3 虚拟机配置参数
这是我经过多次调试后总结的配置,适合瑞芯微平台开发:
- CPU:至少4核,推荐8核(编译内核时差距明显)
- 内存:8GB起步,16GB更佳(我遇到过内存不足导致编译崩溃的情况)
- 磁盘:100GB动态分配,实际使用约60GB(SDK+内核源码+工具链)
- 网络:NAT模式+端口转发(方便SSH连接)
- USB:开启USB 3.0控制器(烧录固件时需要)
注意:磁盘不要选“立即分配所有空间”,动态分配更灵活。我曾经一次性分配200GB,结果后来想扩容反而麻烦。
3.2 交叉编译工具链安装
交叉编译是嵌入式开发的灵魂。说白了,就是在你的x86电脑上编译出能在ARM芯片上跑的程序。瑞芯微官方提供了预编译的工具链,我们直接拿来用就行。
3.2.1 工具链选择
瑞芯微平台主要用两种工具链:
| 工具链 | 适用平台 | 下载位置 |
|---|---|---|
| gcc-arm-8.3-2019.03 | RK3288、RK3399 | ARM官网或瑞芯微SDK |
| gcc-arm-10.3-2021.07 | RK3568、RK3588 | ARM官网或瑞芯微SDK |
| Linaro GCC | 通用ARM平台 | Linaro官网 |
我个人习惯用gcc-arm-10.3-2021.07,兼容性好,对C++17支持完善。如果你做的是老平台移植,比如RK3288,那用8.3版本更稳妥。
3.2.2 安装步骤
安装过程其实很简单,但有几个坑要注意:
- 下载工具链:从ARM官网或瑞芯微SDK中获取
- 解压到指定目录:我习惯放在
/opt/toolchains/下 - 配置环境变量:编辑
~/.bashrc添加路径 - 验证安装:运行
arm-none-linux-gnueabihf-gcc --version
# 下载工具链(以10.3版本为例)
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
# 解压到 /opt
sudo tar -xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt/
sudo mv /opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf /opt/toolchains/
# 配置环境变量
echo 'export PATH=$PATH:/opt/toolchains/bin' >> ~/.bashrc
echo 'export CROSS_COMPILE=arm-none-linux-gnueabihf-' >> ~/.bashrc
source ~/.bashrc
# 验证
arm-none-linux-gnueabihf-gcc --version
避坑指南:我曾经直接把工具链解压到 /usr/local/,结果跟系统自带的gcc冲突了。建议统一放在 /opt/ 下,用环境变量管理。
3.2.3 构建工具安装
除了交叉编译器,还需要一些构建工具:
- make:构建系统核心工具
- cmake:用于一些第三方库的构建
- autoconf/automake:老项目的构建工具
- device-tree-compiler:设备树编译工具
- u-boot-tools:U-Boot镜像制作工具
sudo apt-get update
sudo apt-get install -y \
make cmake \
autoconf automake libtool \
device-tree-compiler \
u-boot-tools \
bison flex \
libncurses-dev \
libssl-dev \
bc
经验之谈:libncurses-dev 和 libssl-dev 这两个包经常被忽略。没有它们,内核的menuconfig配置界面和模块签名功能会报错。我刚开始移植时在这上面卡了半小时。
3.3 Git版本管理
嵌入式Linux开发,版本管理不是可选项,而是必需品。你想想看,内核源码几万个文件,设备树、驱动、配置文件来回改,没有Git根本没法追溯。
3.3.1 Git配置
安装Git很简单,但配置要到位:
# 安装Git
sudo apt-get install git
# 配置用户信息(必须)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 推荐配置
git config --global core.editor "vim"
git config --global merge.tool "vimdiff"
git config --global color.ui true
git config --global core.autocrlf input
注意:core.autocrlf input 这个配置很重要。Windows和Linux的换行符不同,如果不设置,从Windows共享文件夹拷贝代码到虚拟机时,换行符会乱掉。我遇到过因为换行符问题导致内核编译报错,排查了半天。
3.3.2 工作流建议
瑞芯微平台开发,我推荐用这种分支策略:
| 分支 | 用途 | 说明 |
|---|---|---|
master |
官方主线 | 只合并经过验证的代码 |
develop |
日常开发 | 所有修改先合到这里 |
feature/xxx |
新功能开发 | 比如 feature/rk3588-hdmi |
fix/xxx |
Bug修复 | 比如 fix/ddr-timing |
我个人习惯是:每个功能点开一个分支,开发完再合并到develop。这样出了问题可以快速回退,不会影响主线。
3.3.3 常用Git操作
这些命令在移植过程中会频繁用到:
# 克隆瑞芯微内核源码
git clone https://github.com/rockchip-linux/kernel.git
# 查看提交历史
git log --oneline -10
# 创建并切换分支
git checkout -b feature/rk3588-dsi
# 查看修改
git status
git diff
# 提交修改
git add .
git commit -m "dsi: add support for RK3588 DSI controller"
# 合并分支
git checkout develop
git merge feature/rk3588-dsi
# 打标签(发布版本时用)
git tag v5.10-rk3588-v1.0
小技巧:提交信息要写清楚。我见过太多“fix bug”、“update”这种提交,回头看根本不知道改了啥。建议格式:[模块]: [具体修改],比如 drm: fix HDMI hotplug detection on RK3588。
3.4 环境验证
装完所有工具后,建议做一次完整验证。这是我常用的验证脚本:
#!/bin/bash
# 环境验证脚本
echo "=== 检查交叉编译器 ==="
arm-none-linux-gnueabihf-gcc --version
if [ $? -ne 0 ]; then
echo "❌ 交叉编译器未安装"
exit 1
fi
echo "=== 检查构建工具 ==="
make --version | head -1
cmake --version | head -1
dtc --version
echo "=== 检查Git ==="
git --version
echo "=== 编译测试程序 ==="
cat > test.c << EOF
#include <stdio.h>
int main() {
printf("Hello, RK3588!\n");
return 0;
}
EOF
arm-none-linux-gnueabihf-gcc -o test test.c
file test
echo "✅ 环境搭建完成!"
核心思路:环境搭建不是一次性工作。每次换机器、换项目,都要重新走一遍这个流程。我建议你把安装步骤写成脚本,放到Git仓库里管理,这样团队新成员也能快速上手。
这张图把整个开发环境搭建的知识体系串起来了。从虚拟机配置到工具链安装,再到Git管理,最后通过验证脚本闭环。你照着这个流程走一遍,基本不会出大问题。
最后说一句:环境搭建看似繁琐,但这是整个移植工作的地基。地基打牢了,后面编译内核、调试驱动才能顺风顺水。别嫌麻烦,一步到位比反复折腾要省时间。