Skip to content

开发环境搭建

要进行Linux内核驱动开发,首先需要搭建合适的开发环境。这包括安装必要的工具链、配置内核编译环境以及设置调试工具。本章将详细介绍如何搭建一个完整的Linux内核驱动开发环境。

开发主机准备

操作系统选择

虽然可以在多种操作系统上进行Linux内核开发,但最推荐的是使用Linux发行版作为开发主机:

  1. Ubuntu/Debian系列:软件包丰富,社区支持好
  2. Fedora/CentOS/RHEL系列:企业级稳定性
  3. Arch Linux:滚动更新,软件版本较新

对于初学者,推荐使用Ubuntu LTS版本。

必需软件包安装

在基于Debian的系统上安装必需的软件包:

bash
sudo apt update
sudo apt install build-essential gcc gdb make cmake
sudo apt install libncurses-dev bison flex libssl-dev libelf-dev
sudo apt install bc wget git vim

在基于Red Hat的系统上安装:

bash
sudo yum groupinstall "Development Tools"
sudo yum install ncurses-devel bison flex elfutils-libelf-devel openssl-devel
sudo yum install bc wget git vim

交叉编译工具链

对于嵌入式开发,通常需要使用交叉编译工具链。

ARM架构工具链

下载预编译工具链

可以从ARM官网下载预编译的工具链:

bash
# 下载AArch64工具链
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz

# 解压
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz

配置环境变量

将工具链添加到PATH环境变量:

bash
export CROSS_COMPILE=/path/to/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
export ARCH=arm64

构建自定义工具链

如果需要特定版本或配置,可以自己构建工具链:

bash
# 获取crosstool-ng
git clone https://github.com/crosstool-ng/crosstool-ng
cd crosstool-ng

# 配置和构建
./configure --enable-local
make

# 配置工具链
./ct-ng menuconfig

# 构建工具链
./ct-ng build

内核源码获取与配置

获取内核源码

可以通过多种方式获取Linux内核源码:

从kernel.org下载

bash
# 下载最新稳定版
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.x.x.tar.xz
tar -xf linux-6.x.x.tar.xz

# 或者使用git克隆
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

使用发行版源码包

bash
# Ubuntu/Debian
apt-get source linux-image-$(uname -r)

# Fedora
dnf download --source kernel

内核配置

使用默认配置

bash
# 使用当前架构的默认配置
make defconfig

# 或者使用特定板子的配置
make xxx_defconfig

自定义配置

bash
# 图形化配置界面
make menuconfig

# 基于当前运行内核的配置
make localmodconfig

关键配置选项

在menuconfig中需要关注的重要配置:

  1. 启用调试选项

    Kernel hacking --->
      [*] Kernel debugging
      [*] Compile-time checks and compiler options --->
        [*] Compile with debug info
  2. 启用模块支持

    Enable loadable module support --->
      [*] Module unloading
  3. 启用调试信息

    Kernel hacking --->
      [*] Debug filesystem
      [*] Debug kernel data structures

内核编译与安装

编译内核

bash
# 并行编译(根据CPU核心数调整-j参数)
make -j$(nproc)

# 编译特定模块
make M=drivers/xxx/

# 编译设备树(针对ARM平台)
make dtbs

安装内核

安装到开发主机

bash
# 安装内核镜像和模块
sudo make modules_install
sudo make install

# 更新引导加载器
sudo update-grub  # Ubuntu/Debian
sudo grub2-mkconfig -o /boot/grub2/grub.cfg  # Fedora/RHEL

制作启动镜像(嵌入式)

bash
# 创建根文件系统
mkdir rootfs
debootstrap focal rootfs http://archive.ubuntu.com/ubuntu/

# 安装内核到根文件系统
sudo make INSTALL_MOD_PATH=rootfs modules_install

开发工具配置

Vim配置

创建~/.vimrc文件:

vim
set tabstop=8
set shiftwidth=8
set expandtab
set smarttab
syntax on
set number
set autoindent
set smartindent

" C语言相关设置
autocmd FileType c setlocal tabstop=8 shiftwidth=8 noexpandtab

Emacs配置

创建~/.emacs文件:

elisp
;; C模式设置
(add-hook 'c-mode-hook
          (lambda ()
            (setq tab-width 8)
            (setq c-basic-offset 8)
            (setq indent-tabs-mode t)))

;; 显示行号
(global-linum-mode 1)

VS Code配置

安装C/C++扩展,并在项目根目录创建.clang-format文件:

yaml
BasedOnStyle: LLVM
IndentWidth: 8
TabWidth: 8
UseTab: Always
BreakBeforeBraces: Linux
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
AlignAfterOpenBracket: DontAlign
ColumnLimit: 80

调试环境搭建

QEMU模拟器

QEMU是进行内核开发时非常有用的工具:

bash
# 安装QEMU
sudo apt install qemu-system-x86 qemu-system-arm

# 启动内核(x86)
qemu-system-x86_64 -kernel bzImage -append "console=ttyS0" -nographic

# 启动内核(ARM)
qemu-system-aarch64 -machine virt -cpu cortex-a57 -kernel Image -append "console=ttyAMA0" -nographic

GDB调试

内核调试

bash
# 启动带调试功能的QEMU
qemu-system-x86_64 -kernel bzImage -s -S

# 在另一个终端启动GDB
gdb vmlinux
(gdb) target remote localhost:1234
(gdb) continue

模块调试

bash
# 加载带调试信息的模块
insmod mymodule.ko

# 获取模块加载地址
cat /sys/module/mymodule/sections/.text

# 在GDB中添加符号文件
gdb vmlinux
(gdb) add-symbol-file mymodule.ko 0xffffffffc0000000

KGDB调试

KGDB允许通过串口远程调试内核:

bash
# 配置内核启用KGDB
Kernel hacking --->
  [*] Kernel debugging
  [*] KGDB: kernel debugger --->
    [*] KGDB: use kgdb over the serial console

# 启动带KGDB的内核
kgdboc=ttyS0,115200 kgdbwait

# 连接调试器
gdb vmlinux
(gdb) target remote /dev/ttyUSB0

版本控制

Git配置

bash
# 设置用户信息
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 diff.tool vimdiff

内核开发工作流

bash
# 克隆内核仓库
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

# 创建开发分支
git checkout -b my-driver-development

# 开发完成后创建补丁
git format-patch -1 HEAD

# 检查补丁格式
scripts/checkpatch.pl 0001-my-patch.patch

文档与参考资料

内核文档

内核源码中包含了丰富的文档:

bash
# 查看内核文档
cd linux/Documentation

# HTML格式文档
make htmldocs

# PDF格式文档
make pdfdocs

在线资源

  1. 内核官方文档https://www.kernel.org/doc/html/latest/
  2. LWN Kernel Indexhttps://lwn.net/Kernel/Index/
  3. 内核邮件列表https://lore.kernel.org/

最佳实践

目录结构组织

kernel-dev/
├── linux/              # 内核源码
├── toolchain/          # 交叉编译工具链
├── modules/            # 自定义模块
├── scripts/            # 开发脚本
└── docs/               # 开发文档

构建脚本示例

创建build.sh脚本:

bash
#!/bin/bash

# 设置环境变量
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

# 清理之前的构建
make clean

# 配置内核
make defconfig

# 编译内核和模块
make -j$(nproc)
make modules -j$(nproc)

echo "Build completed!"

测试环境搭建

bash
# 创建测试虚拟机
qemu-img create -f qcow2 test.img 10G

# 安装系统到虚拟机
qemu-system-x86_64 -hda test.img -cdrom ubuntu.iso -boot d

# 启动测试环境
qemu-system-x86_64 -hda test.img -kernel bzImage -append "root=/dev/sda1"

通过以上步骤,您就可以搭建一个完整的Linux内核驱动开发环境。这个环境将支持从简单的模块开发到复杂设备驱动的全流程开发和调试。