《Linux 设备驱动开发详解:基于最新的 Linux 4.0 内核》 附录 A VirtualBox + Ubuntu 开发环境搭建

《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

  1. 打开浏览器,访问 https://www.virtualbox.org/wiki/Downloads

  2. VirtualBox platform packages 下,点击 Windows hosts 下载

    下载页面示意:
    ┌─────────────────────────────────────────────────────────────┐
    │ VirtualBox 6.1.x platform packages │
    │ │
    │ • Windows hosts ← 点击此处下载 │
    │ • OS X hosts │
    │ • Linux distributions │
    │ • Solaris hosts │
    └─────────────────────────────────────────────────────────────┘

A.2.2 安装 VirtualBox

  1. 双击下载的 VirtualBox-6.1.x-Win.exe 安装文件

  2. 按照安装向导操作:

    安装步骤:

    步骤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 新建虚拟机

  1. 打开 VirtualBox,点击 新建(New)

  2. 填写虚拟机基本信息:

    新建虚拟机 - 步骤1:名称和操作系统
    ┌─────────────────────────────────────────────────────────────┐
    │ 名称(Name):Ubuntu-20.04-Driver-Dev │
    │ 机器文件夹:D:\VirtualBox VMs\(建议放在空间大的磁盘) │
    │ 类型(Type):Linux │
    │ 版本(Version):Ubuntu (64-bit) │
    └─────────────────────────────────────────────────────────────┘
    点击 [下一步]

  3. 设置内存大小:

    新建虚拟机 - 步骤2:内存大小
    ┌─────────────────────────────────────────────────────────────┐
    │ 内存大小(Memory size): │
    │ ████████████████░░░░░░░░ 4096 MB │
    │ │
    │ 推荐:4096 MB(4GB) │
    │ 最低:2048 MB(2GB) │
    │ 主机内存 8GB 时,分配 4GB 给虚拟机 │
    └─────────────────────────────────────────────────────────────┘
    点击 [下一步]

  4. 创建虚拟硬盘:

    新建虚拟机 - 步骤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 启动安装

  1. 在 VirtualBox 主界面,选中虚拟机,点击 启动(Start)

  2. 虚拟机从 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.xzgit 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年