《Linux 设备驱动开发详解:基于最新的 Linux 4.0 内核》
附录 A VirtualBox + Ubuntu 开发环境搭建
参考:宋宝华 著,机械工业出版社,2015年版
A.1 开发环境概述
A.1.1 为什么使用虚拟机
对于 Linux 驱动开发初学者,在 Windows 主机上使用虚拟机运行 Linux 是最便捷的入门方式:
开发环境选择对比:
方案一:直接安装 Linux(双系统)
优点:性能最好,与真实环境一致
缺点:需要重启切换系统,配置复杂
方案二:VirtualBox + Ubuntu(推荐入门)
优点:
✓ 无需重启,Windows 和 Linux 同时运行
✓ 快照功能,可以随时回滚
✓ 共享文件夹,方便文件交换
✓ 免费开源
缺点:
✗ 性能略低于原生系统
✗ 不适合需要直接访问硬件的场景
方案三:WSL2(Windows Subsystem for Linux)
优点:与 Windows 深度集成,性能好
缺点:某些内核功能受限,不适合内核开发
本附录选择:VirtualBox + Ubuntu 20.04 LTS
A.1.2 所需软件和资源
所需软件:
1. VirtualBox 6.1+(虚拟机软件)
下载地址:https://www.virtualbox.org/wiki/Downloads
选择:Windows hosts 版本
2. VirtualBox Extension Pack(扩展包,可选)
提供 USB 3.0、RDP 等功能
与 VirtualBox 版本必须匹配
3. Ubuntu 20.04 LTS ISO 镜像
下载地址:https://ubuntu.com/download/desktop
文件名:ubuntu-20.04.x-desktop-amd64.iso
大小:约 2.8GB
推荐配置:
主机内存:≥ 8GB(虚拟机分配 4GB)
主机磁盘:≥ 50GB 可用空间(虚拟机分配 40GB)
主机 CPU:支持虚拟化(Intel VT-x 或 AMD-V)
A.2 安装 VirtualBox
A.2.1 下载 VirtualBox
-
打开浏览器,访问
https://www.virtualbox.org/wiki/Downloads -
在 VirtualBox platform packages 下,点击 Windows hosts 下载
下载页面示意:
┌─────────────────────────────────────────────────────────────┐
│ VirtualBox 6.1.x platform packages │
│ │
│ • Windows hosts ← 点击此处下载 │
│ • OS X hosts │
│ • Linux distributions │
│ • Solaris hosts │
└─────────────────────────────────────────────────────────────┘
A.2.2 安装 VirtualBox
-
双击下载的
VirtualBox-6.1.x-Win.exe安装文件 -
按照安装向导操作:
安装步骤:
步骤1:欢迎界面
点击 [Next >]步骤2:选择安装组件
保持默认选择,点击 [Next >]
┌─────────────────────────────────────────────────────────┐
│ ☑ VirtualBox Application │
│ ☑ VirtualBox USB Support │
│ ☑ VirtualBox Networking │
│ ☑ VirtualBox Python Support │
└─────────────────────────────────────────────────────────┘步骤3:选择安装路径
默认:C:\Program Files\Oracle\VirtualBox
点击 [Next >]步骤4:警告提示(网络接口)
提示安装过程中网络会短暂断开
点击 [Yes] 继续步骤5:准备安装
点击 [Install]步骤6:安装完成
☑ Start Oracle VM VirtualBox after installation
点击 [Finish]
A.2.3 启用 CPU 虚拟化
如果 VirtualBox 提示 CPU 不支持虚拟化,需要在 BIOS 中开启:
开启 CPU 虚拟化(以 Intel 为例):
1. 重启电脑,按 Del/F2/F10 进入 BIOS
2. 找到 Advanced → CPU Configuration
3. 将 Intel Virtualization Technology 设置为 Enabled
4. 保存并退出(F10)
AMD CPU:
找到 Advanced → CPU Configuration
将 SVM Mode 设置为 Enabled
A.3 创建 Ubuntu 虚拟机
A.3.1 新建虚拟机
-
打开 VirtualBox,点击 新建(New)
-
填写虚拟机基本信息:
新建虚拟机 - 步骤1:名称和操作系统
┌─────────────────────────────────────────────────────────────┐
│ 名称(Name):Ubuntu-20.04-Driver-Dev │
│ 机器文件夹:D:\VirtualBox VMs\(建议放在空间大的磁盘) │
│ 类型(Type):Linux │
│ 版本(Version):Ubuntu (64-bit) │
└─────────────────────────────────────────────────────────────┘
点击 [下一步] -
设置内存大小:
新建虚拟机 - 步骤2:内存大小
┌─────────────────────────────────────────────────────────────┐
│ 内存大小(Memory size): │
│ ████████████████░░░░░░░░ 4096 MB │
│ │
│ 推荐:4096 MB(4GB) │
│ 最低:2048 MB(2GB) │
│ 主机内存 8GB 时,分配 4GB 给虚拟机 │
└─────────────────────────────────────────────────────────────┘
点击 [下一步] -
创建虚拟硬盘:
新建虚拟机 - 步骤3:虚拟硬盘
┌─────────────────────────────────────────────────────────────┐
│ ○ 不添加虚拟硬盘 │
│ ● 现在创建虚拟硬盘(推荐) │
│ ○ 使用已有的虚拟硬盘文件 │
└─────────────────────────────────────────────────────────────┘
点击 [创建]虚拟硬盘文件类型:
● VDI(VirtualBox 磁盘映像)← 推荐
○ VHD(虚拟硬盘)
○ VMDK(虚拟机磁盘)
点击 [下一步]存储在物理硬盘上:
○ 动态分配(按需增长,节省空间)← 推荐
● 固定大小(性能更好)
点击 [下一步]文件位置和大小:
位置:D:\VirtualBox VMs\Ubuntu-20.04-Driver-Dev\Ubuntu-20.04-Driver-Dev.vdi
大小:40.00 GB(驱动开发建议 40GB 以上)
点击 [创建]
A.3.2 配置虚拟机
创建完成后,在 VirtualBox 主界面选中虚拟机,点击 设置(Settings):
① 系统设置
设置 → 系统(System)
处理器(Processor)选项卡:
处理器数量:2(根据主机 CPU 核心数调整)
☑ 启用 PAE/NX
☑ 启用嵌套 VT-x/AMD-V(如果可用)
主板(Motherboard)选项卡:
启动顺序:
☑ 软驱(取消勾选)
☑ 光驱(保持勾选,用于安装系统)
☑ 硬盘(保持勾选)
☑ 启用 EFI(可选)
② 显示设置
设置 → 显示(Display)
屏幕(Screen)选项卡:
显存大小:128 MB(最大值)
☑ 启用 3D 加速(可选)
显示器数量:1
③ 存储设置(加载 ISO)
设置 → 存储(Storage)
存储设备:
控制器:IDE
└── 没有盘片(点击光盘图标)
→ 选择虚拟光盘文件
→ 浏览到 ubuntu-20.04.x-desktop-amd64.iso
→ 点击 [打开]
设置后显示:
控制器:IDE
└── ubuntu-20.04.x-desktop-amd64.iso(光驱)
④ 网络设置
设置 → 网络(Network)
网卡1(Adapter 1):
☑ 启用网络连接
连接方式:网络地址转换(NAT)← 默认,可以访问互联网
(可选)网卡2:
☑ 启用网络连接
连接方式:仅主机(Host-Only)← 用于主机与虚拟机通信
⑤ 共享文件夹设置
设置 → 共享文件夹(Shared Folders)
点击右侧 [+] 按钮添加共享文件夹:
文件夹路径:D:\LinuxDriver(主机上的目录)
文件夹名称:LinuxDriver
☑ 自动挂载
挂载点:/mnt/LinuxDriver
☑ 固定分配
注意:需要安装 VirtualBox Guest Additions 后才能使用共享文件夹
A.4 安装 Ubuntu 20.04
A.4.1 启动安装
-
在 VirtualBox 主界面,选中虚拟机,点击 启动(Start)
-
虚拟机从 ISO 启动,出现 Ubuntu 安装界面:
Ubuntu 安装界面:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ● Try Ubuntu(试用,不安装) │
│ ● Install Ubuntu(安装 Ubuntu)← 选择此项 │
│ │
└─────────────────────────────────────────────────────────────┘
A.4.2 安装步骤
安装步骤详解:
步骤1:选择语言
左侧列表选择 "中文(简体)"
点击 [安装 Ubuntu]
步骤2:键盘布局
选择 "Chinese" → "Chinese"
点击 [继续]
步骤3:更新和其他软件
● 正常安装(推荐)
☑ 安装 Ubuntu 时下载更新(可选,需要网络)
☑ 为图形或无线硬件,以及其他媒体格式安装第三方软件(推荐)
点击 [继续]
步骤4:安装类型
● 清除整个磁盘并安装 Ubuntu(虚拟机中安全)
点击 [现在安装]
弹出确认对话框,点击 [继续]
步骤5:您在哪里?
选择时区:Shanghai(上海)
点击 [继续]
步骤6:您是谁?
您的姓名:driver-dev(或您的名字)
您的计算机名:ubuntu-driver
选择一个用户名:driver(或您的用户名)
选择一个密码:(设置密码,建议简单易记,如 123456)
确认您的密码:(重复密码)
● 登录时需要密码
点击 [继续]
步骤7:等待安装完成
安装过程约需 10~20 分钟
安装完成后点击 [现在重启]
提示移除安装介质时,按 Enter 键
A.4.3 首次启动配置
Ubuntu 首次启动配置:
1. 登录界面
输入安装时设置的密码,按 Enter
2. 欢迎向导
点击 [跳过] 或按提示完成
3. 更新提示
建议先跳过,安装完开发工具后再更新
4. 调整分辨率(可选)
右键桌面 → 显示设置
分辨率:1920×1080 或 1280×800
A.5 安装 VirtualBox Guest Additions
Guest Additions 是 VirtualBox 提供的增强功能包,安装后可以:
- 自动调整虚拟机分辨率
- 使用共享文件夹
- 双向复制粘贴
- 无缝鼠标切换
A.5.1 安装步骤
bash
# 步骤1:在 VirtualBox 菜单中插入 Guest Additions CD
# 虚拟机窗口菜单 → 设备(Devices)→ 安装增强功能(Insert Guest Additions CD image)
# 步骤2:在 Ubuntu 终端中安装依赖
sudo apt-get update
sudo apt-get install -y build-essential dkms linux-headers-$(uname -r)
# 步骤3:挂载并运行安装脚本
sudo mkdir -p /mnt/cdrom
sudo mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom
sudo ./VBoxLinuxAdditions.run
# 步骤4:重启虚拟机
sudo reboot
A.5.2 验证安装
bash
# 验证 Guest Additions 是否安装成功
lsmod | grep vbox
# vboxsf 81920 1
# vboxguest 327680 2 vboxsf
# vboxvideo 20480 0
# 验证共享文件夹
ls /mnt/LinuxDriver/
# (显示主机共享目录中的文件)
# 如果共享文件夹无法访问,将用户添加到 vboxsf 组
sudo usermod -aG vboxsf $USER
# 重新登录后生效
A.6 配置 Ubuntu 开发环境
A.6.1 更换国内软件源(加速下载)
bash
# 备份原始源文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为阿里云源
sudo tee /etc/apt/sources.list << 'EOF'
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
EOF
# 更新软件包列表
sudo apt-get update
A.6.2 安装基础开发工具
bash
# 安装编译工具链和常用工具
sudo apt-get install -y \
build-essential \ # gcc、make、binutils 等
git \ # 版本控制
vim \ # 文本编辑器
tree \ # 目录树显示
wget \ # 文件下载
curl \ # HTTP 工具
net-tools \ # ifconfig 等网络工具
openssh-server \ # SSH 服务器(用于远程连接)
python3 \ # Python 3
python3-pip # pip 包管理器
# 验证 gcc 版本
gcc --version
# gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
# 验证 make 版本
make --version
# GNU Make 4.2.1
A.6.3 安装内核开发工具
bash
# 安装内核头文件(用于编译内核模块)
sudo apt-get install -y linux-headers-$(uname -r)
# 验证内核头文件
ls /lib/modules/$(uname -r)/build/
# Kconfig Makefile arch block crypto drivers ...
# 安装内核编译依赖
sudo apt-get install -y \
libncurses-dev \ # make menuconfig 图形界面
libssl-dev \ # 内核签名
libelf-dev \ # ELF 格式支持
flex \ # 词法分析器
bison \ # 语法分析器
bc \ # 计算工具
dwarves \ # pahole 工具(BTF 支持)
zstd # 压缩工具
# 安装 ARM 交叉编译工具链
sudo apt-get install -y \
gcc-arm-linux-gnueabihf \ # ARM 硬浮点工具链
gcc-aarch64-linux-gnu # ARM64 工具链
# 验证交叉编译工具链
arm-linux-gnueabihf-gcc --version
# arm-linux-gnueabihf-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
# 安装设备树编译器
sudo apt-get install -y device-tree-compiler
# 验证 dtc
dtc --version
# Version: DTC 1.5.0
A.6.4 安装调试工具
bash
# 安装调试和分析工具
sudo apt-get install -y \
gdb \ # GNU 调试器
gdb-multiarch \ # 多架构 GDB(用于交叉调试)
strace \ # 系统调用跟踪
ltrace \ # 库函数调用跟踪
valgrind \ # 内存检测工具
linux-tools-$(uname -r) \ # perf 工具
linux-tools-generic \ # perf 通用版本
trace-cmd \ # ftrace 前端工具
kernelshark \ # ftrace 可视化工具
mtd-utils \ # MTD 工具(Flash 操作)
i2c-tools \ # I2C 工具
evtest \ # 输入设备测试
usbutils \ # USB 工具(lsusb)
pciutils # PCI 工具(lspci)
# 验证 perf
perf --version
# perf version 5.4.0
# 验证 gdb
gdb --version
# GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
A.6.5 安装 QEMU 虚拟机
bash
# 安装 QEMU(用于模拟 ARM 开发板)
sudo apt-get install -y \
qemu-system-arm \ # ARM 系统模拟
qemu-system-aarch64 \ # ARM64 系统模拟
qemu-user-static # 用户态 ARM 程序模拟
# 验证 QEMU
qemu-system-arm --version
# QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.24)
A.6.6 配置 SSH 服务
bash
# 启动 SSH 服务
sudo systemctl start ssh
sudo systemctl enable ssh
# 查看 SSH 状态
sudo systemctl status ssh
# ● ssh.service - OpenBSD Secure Shell server
# Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
# Active: active (running)
# 查看虚拟机 IP 地址
ip addr show
# 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
# inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
# 在主机上通过 SSH 连接虚拟机(需要配置端口转发)
# VirtualBox 设置 → 网络 → 高级 → 端口转发
# 规则:主机端口 2222 → 虚拟机端口 22
# 然后在主机上:ssh -p 2222 driver@127.0.0.1
A.7 获取 Linux 内核源码
A.7.1 从 kernel.org 下载
bash
# 创建工作目录
mkdir -p ~/linux-driver-dev
cd ~/linux-driver-dev
# 方法一:下载 Linux 4.0 源码包(本书使用的版本)
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.xz
tar -xf linux-4.0.tar.xz
cd linux-4.0
# 方法二:下载最新稳定版
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
tar -xf linux-6.6.tar.xz
# 方法三:通过 Git 克隆(推荐,可以获取最新代码)
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.0 # 切换到 v4.0 版本
# 查看内核版本
head -5 Makefile
# VERSION = 4
# PATCHLEVEL = 0
# SUBLEVEL = 0
A.7.2 编译 x86 内核(本机测试)
bash
cd ~/linux-driver-dev/linux-4.0
# 使用默认配置
make defconfig
# 或图形化配置
make menuconfig
# 编译内核(使用所有 CPU 核心)
make -j$(nproc)
# 编译完成后的产物
ls -lh arch/x86/boot/bzImage
# -rw-r--r-- 1 driver driver 7.8M Jun 21 10:00 arch/x86/boot/bzImage
ls -lh vmlinux
# -rwxr-xr-x 1 driver driver 456M Jun 21 10:00 vmlinux
A.7.3 编译 ARM 内核(交叉编译)
bash
cd ~/linux-driver-dev/linux-4.0
# 设置交叉编译环境变量
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
# 使用 Vexpress 开发板默认配置
make vexpress_defconfig
# 图形化配置(可选)
make menuconfig
# 编译内核
make -j$(nproc) zImage
# 编译设备树
make dtbs
# 编译模块
make -j$(nproc) modules
# 查看编译结果
ls -lh arch/arm/boot/zImage
# -rwxr-xr-x 1 driver driver 3.8M Jun 21 10:00 arch/arm/boot/zImage
ls arch/arm/boot/dts/vexpress-v2p-ca9.dtb
# arch/arm/boot/dts/vexpress-v2p-ca9.dtb
A.8 编写并测试第一个内核模块
A.8.1 创建模块源码
bash
# 创建模块目录
mkdir -p ~/linux-driver-dev/hello_module
cd ~/linux-driver-dev/hello_module
# 创建源文件
cat > hello.c << 'EOF'
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, Linux Driver World!\n");
printk(KERN_INFO "内核版本:%s\n", UTS_RELEASE);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, Linux Driver World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Linux Driver Developer");
MODULE_DESCRIPTION("Hello World 内核模块");
MODULE_VERSION("1.0");
EOF
# 创建 Makefile
cat > Makefile << 'EOF'
KERNEL_DIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m := hello.o
all:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean
.PHONY: all clean
EOF
A.8.2 编译和测试模块
bash
# 编译模块
make
# make -C /lib/modules/5.4.0-xxx/build M=/home/driver/linux-driver-dev/hello_module modules
# Building modules, stage 2.
# MODPOST 1 modules
# CC [M] /home/driver/linux-driver-dev/hello_module/hello.ko
# 查看生成的文件
ls -la
# -rw-r--r-- 1 driver driver xxx hello.c
# -rw-r--r-- 1 driver driver xxx hello.ko ← 内核模块
# -rw-r--r-- 1 driver driver xxx hello.mod.c
# -rw-r--r-- 1 driver driver xxx hello.mod.o
# -rw-r--r-- 1 driver driver xxx hello.o
# -rw-r--r-- 1 driver driver xxx Makefile
# -rw-r--r-- 1 driver driver xxx Module.symvers
# -rw-r--r-- 1 driver driver xxx modules.order
# 查看模块信息
modinfo hello.ko
# filename: /home/driver/linux-driver-dev/hello_module/hello.ko
# version: 1.0
# description: Hello World 内核模块
# author: Linux Driver Developer
# license: GPL v2
# srcversion: XXXXXXXXXXXXXXXXXXXXXXX
# depends:
# retpoline: Y
# name: hello
# vermagic: 5.4.0-xxx SMP mod_unload
# 加载模块
sudo insmod hello.ko
# 查看内核日志
dmesg | tail -5
# [ 100.123] Hello, Linux Driver World!
# [ 100.124] 内核版本:5.4.0-xxx
# 查看已加载模块
lsmod | grep hello
# hello 16384 0
# 卸载模块
sudo rmmod hello
# 再次查看日志
dmesg | tail -3
# [ 200.456] Goodbye, Linux Driver World!
A.9 配置 VS Code 开发环境(可选)
A.9.1 安装 VS Code
bash
# 下载并安装 VS Code
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt-get update
sudo apt-get install -y code
# 启动 VS Code
code
A.9.2 安装推荐插件
VS Code 推荐插件(在扩展市场搜索安装):
1. C/C++(Microsoft)
提供 C/C++ 语法高亮、智能补全、调试支持
2. C/C++ Extension Pack(Microsoft)
C/C++ 扩展包,包含多个有用工具
3. Kernel Snippets
Linux 内核代码片段
4. GitLens
Git 增强功能
5. Remote - SSH(Microsoft)
通过 SSH 远程开发(连接开发板)
6. Hex Editor(Microsoft)
十六进制文件查看器(查看固件等二进制文件)
A.9.3 配置内核代码智能补全
json
// 在项目根目录创建 .vscode/c_cpp_properties.json
{
"configurations": [
{
"name": "Linux Kernel",
"includePath": [
"${workspaceFolder}/**",
"/lib/modules/${uname -r}/build/include",
"/lib/modules/${uname -r}/build/arch/x86/include",
"/usr/include"
],
"defines": [
"__KERNEL__",
"MODULE",
"KBUILD_MODNAME=\"my_driver\""
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
A.10 常见问题与解决方法
A.10.1 虚拟机性能优化
性能优化建议:
1. 增加处理器核心数
设置 → 系统 → 处理器 → 增加到 2~4 核
2. 启用嵌套虚拟化
设置 → 系统 → 处理器 → ☑ 启用嵌套 VT-x/AMD-V
3. 使用固态硬盘存储虚拟机文件
将虚拟机文件放在 SSD 上,显著提升 I/O 性能
4. 增加显存
设置 → 显示 → 显存大小 → 128 MB
5. 禁用不需要的功能
设置 → 音频 → 取消 ☑ 启用音频(如果不需要)
设置 → USB → 取消 ☑ 启用 USB 控制器(如果不需要)
A.10.2 常见错误解决
bash
# 错误1:make menuconfig 报错 "ncurses library not found"
sudo apt-get install -y libncurses-dev
# 错误2:编译内核模块时报错 "No rule to make target"
# 确认内核头文件已安装
sudo apt-get install -y linux-headers-$(uname -r)
# 错误3:insmod 报错 "Invalid module format"
# 模块编译时使用的内核版本与当前运行内核不匹配
# 重新编译模块:
make clean && make
# 错误4:insmod 报错 "Operation not permitted"
# 需要 root 权限
sudo insmod hello.ko
# 错误5:虚拟机无法访问互联网
# 检查网络设置:设置 → 网络 → 连接方式:NAT
# 在虚拟机中测试:ping 8.8.8.8
# 错误6:共享文件夹无法访问
# 确认已安装 Guest Additions
# 将用户添加到 vboxsf 组:
sudo usermod -aG vboxsf $USER
# 重新登录后生效
# 错误7:交叉编译工具链找不到
# 检查是否安装:
which arm-linux-gnueabihf-gcc
# 如果没有输出,重新安装:
sudo apt-get install -y gcc-arm-linux-gnueabihf
# 错误8:QEMU 启动内核失败
# 检查内核镜像和设备树文件路径是否正确
# 检查 QEMU 版本是否支持目标平台
qemu-system-arm -M help | grep vexpress
A.10.3 快照管理
VirtualBox 快照功能(强烈推荐):
创建快照:
虚拟机菜单 → 机器(Machine)→ 拍摄快照(Take Snapshot)
名称:Ubuntu-20.04-基础环境
描述:安装完成,配置好开发工具
建议在以下时机创建快照:
✓ Ubuntu 安装完成后
✓ 安装完所有开发工具后
✓ 开始重要实验前
✓ 内核编译成功后
恢复快照:
虚拟机菜单 → 机器 → 恢复快照
选择要恢复的快照,点击 [恢复]
注意:恢复快照会丢失快照后的所有更改!
A.11 开发环境验证清单
bash
# 完整验证脚本
echo "=== Linux 驱动开发环境验证 ==="
echo ""
echo "1. 系统信息:"
uname -a
lsb_release -a 2>/dev/null | grep Description
echo ""
echo "2. 编译工具:"
gcc --version | head -1
make --version | head -1
arm-linux-gnueabihf-gcc --version | head -1
echo ""
echo "3. 内核头文件:"
ls /lib/modules/$(uname -r)/build/Makefile && echo "✓ 内核头文件已安装" || echo "✗ 内核头文件未安装"
echo ""
echo "4. 调试工具:"
which gdb && echo "✓ gdb 已安装" || echo "✗ gdb 未安装"
which strace && echo "✓ strace 已安装" || echo "✗ strace 未安装"
which perf && echo "✓ perf 已安装" || echo "✗ perf 未安装"
echo ""
echo "5. QEMU:"
qemu-system-arm --version | head -1
echo ""
echo "6. 设备树编译器:"
dtc --version
echo ""
echo "7. Git:"
git --version
echo ""
echo "=== 验证完成 ==="
预期输出:
=== Linux 驱动开发环境验证 ===
1. 系统信息:
Linux ubuntu-driver 5.4.0-xxx-generic #xxx-Ubuntu SMP ...
Description: Ubuntu 20.04.x LTS
2. 编译工具:
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
GNU Make 4.2.1
arm-linux-gnueabihf-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
3. 内核头文件:
✓ 内核头文件已安装
4. 调试工具:
✓ gdb 已安装
✓ strace 已安装
✓ perf 已安装
5. QEMU:
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.24)
6. 设备树编译器:
Version: DTC 1.5.0
7. Git:
git version 2.25.1
=== 验证完成 ===
附录 A 小结
| 步骤 | 内容 | 关键命令/操作 |
|---|---|---|
| A.2 | 安装 VirtualBox | 下载安装包,按向导安装 |
| A.3 | 创建虚拟机 | 4GB 内存,40GB 磁盘,加载 Ubuntu ISO |
| A.4 | 安装 Ubuntu 20.04 | 按安装向导操作,设置用户名和密码 |
| A.5 | 安装 Guest Additions | sudo ./VBoxLinuxAdditions.run |
| A.6 | 配置开发环境 | sudo apt-get install build-essential gcc-arm-linux-gnueabihf ... |
| A.7 | 获取内核源码 | wget linux-4.0.tar.xz 或 git clone |
| A.8 | 测试第一个模块 | make && sudo insmod hello.ko && dmesg |
| A.9 | 配置 VS Code | 安装 C/C++ 插件,配置 includePath |
| A.10 | 常见问题解决 | 参考错误解决方案 |
开发环境搭建完成后的下一步
环境搭建完成后,建议按以下顺序学习:
1. 阅读第1章:理解 Linux 设备驱动的基本概念
2. 完成第4章:编写并运行 Hello World 内核模块
3. 完成第6章:实现 globalmem 字符设备驱动
4. 搭建 QEMU ARM 环境:模拟嵌入式开发板
5. 逐章学习各类设备驱动
祝学习顺利!
参考文献:宋宝华《Linux设备驱动开发详解:基于最新的Linux 4.0内核》,机械工业出版社,2015年